zoukankan      html  css  js  c++  java
  • Python-接口开发入门

    一、开发接口的作用:

    1、mock接口:模拟一些接口。有一些有关联的接口,在别的接口没有开发好的时候,需要用这个接口,就可以写一个假接口,返回想要的结果来模拟这个接口。

    2、知道服务端的开发逻辑,有助于测试;

    3、比如不想让其他人看很多数据库中的数据,可以通过接口只返回一部分数据。

    二、开发一个接口

    1、flask是一个轻量级的开发框架

    __name__:代表当前这个python文件

    server = flask.Flask(__name__)  :把当前这个python文件,当做一个服务

    2、一个无需传参数的get接口

    其中,‘index’是接口的路径。

    method如果不写,默认为get。如果需要支持多种,可以写成['get','post']

    port是端口号,默认为5000。debug=True,这样改了代码之后,不需要重启服务,会自动重启。

    先运行,然后用postman调用该接口,如下

    可以看到,中文的编码之后的,想显示中文,按照下图方法即可

    3、一个post接口

     开发一个注册接口,请求参数为:username和passwd。如果数据库中有该用户,就返回用户已存在。如果该用户不存在,就在数据库插入一条数据,返回注册成功。

    下面的代码需要连接数据库,连接数据库部分省略了。

     

     为了让其他人也可以访问这个接口,可以用如下方法:

    host=0.0.0.0表示只要在同一个局域网,别人访问的时候,用你的ip就可以访问了。ip指的是电脑的ip。
    假如电脑的ip是10.2.88.122,那么别人电脑访问10.2.88.122:8999/reg即可。

    三、开发接口目录

    目录结构如下

    主目录命名为my_api,可以根据实际情况命名

    bin:可执行文件,即启动程序

    config:配置文件

    data:放置一些数据,如sql、入参等

    lib:主逻辑

    logs:log

    readme:一些说明

    我们把上面的代码分到各个目录里面

    1、配置文件config-setting.py

    存放一些常量,如数据库的信息,redis的信息,端口号等

     2、lib目录下tools.py

    tools文件里写了怎么操作sql和redis

    倒入setting里的信息,需要把my_api加到环境变量里。

    在my_api文件夹上右击,选择mark directory as ->Source Root

    导入setting

    如果常量太多,则可以直接from config import setting

    使用时,setting.MYSQL_INFO。用setting加点的方法。

     3、lib目录下interface.py

    这里写接口的主逻辑

    4、bin目录下start.py

     先从interface中导入server,从setting中导入端口号。

    启动程序时,只需运行start.py即可

     四、有cookie,有依赖关系的接口开发

    1、目录结构同上,其中操作tools.py如下

    import redis,hashlib
    # pycharm帮你加环境变量
    # 在主目录  my_api单击右键,Mark dictionary as 选sources root
    from config.setting import REDIS_INFO
    
    def op_redis(k,v=None,time=None):
        r = redis.Redis(**REDIS_INFO)
        if v:
            r.set(k,v,time)
            res = 'ok'
        else:
            res = r.get(k)
            if res:
                res = res.decode()
        return res
    
    def my_md5(s):
        md = hashlib.md5()
        md.update(s.encode())
        return md.hexdigest()

    2、要求:(1)登录成功后,把cookie写入redis,其中key为 wind_session:username,value为session。  session生成规则是“username+当前时间(年月日时分秒格式)”组成的字符串进行md5加密(2)posts接口获取到要发表的文章的标题和内容,用session判断用户的登录状态,如果是登录状态,则文章可以发表,并写入redis。

    分析:

    (1)首先说登录接口,我们需要先生成session,然后存放到redis里。session按照要求,生成方式如下

    写入redis直接调用tools里面的op_redis即可,过期时间这里是随便设置的6000s

    还有一步就是cookie

    完整的登录代码如下。这里主要是为了说明cookie,因此没有对登录进行复杂的校验。最后会有完整的代码和运行结果,如果看的云里雾里,可以先看下运行结果。

     (2)posts接口,需要获取到cookie,然后和redis中存的进行对比,如果一致,说明是登录状态,可以发表文章。

     获取cookie用下面的方法

    我们可以打印出来,看一下cookie的格式,如下,是字典格式。因此取session时,按照字典取值的方法即可。

     

    对我们有用的cookie是以wind_session为开头的,其他的cookie我们不用关注。因此我们只选出这部分,取出session值,和redis中对比。

    步骤为:

    A、if语句中,是我们取到的cookie,从中提取出用户名和session。

    B、从redis中取出对应用户的session

    C、两者对比

    D、如果是登录状态,返回文章发表成功,并且把文章写入redis。

     

     (3)完整代码

    interface.py:

    import flask,time,json
    from lib import tools
    from config import setting
    
    server = flask.Flask(__name__)
    
    @server.route('/login')
    def login():
        username = flask.request.values.get('username')
        pwd = flask.request.values.get('pwd')
        if username == 'wind' and pwd == '123456':
            session_id = tools.my_md5(username+time.strftime('%Y%m%d%H%M%S'))
            key = 'wind_session:%s'%username
            tools.op_redis(key,session_id,6000)
            res = {'session_id':session_id,'error_code':0,'msg':'登录成功','login_time':time.strftime('%Y%m%d%H%M%S')}#给用户返回的信息
            json_res = json.dumps(res,ensure_ascii=False)#返回结果为json格式
            res = flask.make_response(json_res)   #cookie 构造成返回结果的对象
            res.set_cookie(key,session_id,6000)#最后的数字是cookie的失效时间
            return res
    
    @server.route('/posts')
    def posts():
    
        print('all_cookies',flask.request.cookies) #字典形式
        cookies = flask.request.cookies #获取到所有的cookie
        username = '' #定义这两个变量是为了在没有传cookie时用的
        session = ''
        for cookie in cookies:
            if cookie.startswith('wind_session'): #判断cookie以syz_session开头的话,取到它
                username = cookie  #或者username = key   session = value
                session = cookies.get(cookie) #调用接口时,用户传的session
        redis_session = tools.op_redis(username) #从redis中获取的
        if redis_session == session:#判断传过来的session和redis中存的一样
            title = flask.request.values.get('title') #获取文章标题
            content = flask.request.values.get('content') #获取文章内容
            article_key = 'article:%s'%title #key以article开头
            tools.op_redis(article_key,content) #把文章写入redis
            res = {'msg':'文章发表成功!','code':0}
        else:
            res = {'msg':'用户未登录','code':2009}
        # print('username:',username)
        # print('session:',session)
        return json.dumps(res,ensure_ascii=False)

    运行结果:

    1、login接口

    框起来的,是本次运行的cookie

    redis里如下

    2、posts接口

    redis中

     五、配置环境变量的方法

    以上接口开发时,我们调用自己写的方法,是通过先把new_api文件夹mark as source root。这样在pycharm运行是没问题的,但是如果我们把代码在其他设备上使用,或者直接用命令行启动,就会有问题。

    直接在命令行运行如下,会发现很多模块是找不到的。

    如果把new_api添加到环境变量,就可以运行。

    方法一:直接把new_api的路径添加到环境变量,但是这种方法不灵活,一旦文件换了位置,或者换个设备,需要重新修改路径

    方法二:自动获取路径,添加到环境变量

     __file__:获取当前路径,这个路径分隔符是“/”,不能直接添加到环境变量

     os.path.abspath(__file__):当前路径,分隔符是"",可以直接添加到环境变量

    os.path.dirname():取上一级目录

    这里完整的添加环境变量方法为:

    添加之后,就可以直接用命令行启动服务了。

  • 相关阅读:
    Java 获取代码运行时间
    CentOS7 配置阿里yum源
    MySQL优化服务器设置(MySQL优化配置文件)
    Mysql查看状态,连接数,线程数以及Mysql性能监控工具doDBA的使用以及优化
    SpringBoot专栏(四) -- SpringBoot+MyBatis集成Druid连接池
    SpringBoot专栏(三) -- SpingBoot集成MyBatis框架
    利用MyBatis生成器自动生成实体类、DAO接口和Mapping映射文件
    在Linux上搭建Jmeter测试环境
    MySQL 修改最大连接数(max_connections)失效,上限214问题
    javase基础
  • 原文地址:https://www.cnblogs.com/zhxwind/p/11202629.html
Copyright © 2011-2022 走看看