zoukankan      html  css  js  c++  java
  • python学习笔记(十三)接口开发

    一、开发接口的作用

          1.mock接口,模拟一些接口,在别的接口没有开发好的时候,需要开发一些模拟接口进行调试和测试。

          2.查看数据,比如,获取所有学员信息的接口,就不需要提供数据库的查看信息。

    二、接口开发

          1.在接口开发前,需先安装flask模块,它是一个轻量级的web开发框架。pip install flask

           先写个简单的接口来热热身吧。。。。

    import flask,json
    # __name__,代表当前这个python文件
    server = flask.Flask(__name__)#把咱们当前这个python文件,当做一个服务
    
    #ip:8000/index?param
    @server.route('/index',methods=['get'])#methods是指接口支持哪种请求方式,不写的话默认是get请求
    def index():
        res = {'msg':'这是我开发的第一个接口','msg_code':0}
        return json.dumps(res,ensure_ascii=False)
    
    #默认端口号是5000,可以在这里自己设定
    #debug=True是指在在改动代码后服务会自动帮你重启
    #host=0.0.0.0表示别人访问的时候,用你的ip就可以访问了
    server.run(port=8000,debug=True,host='0.0.0.0')#启动服务

    运行这段代码,然后在浏览器输入http://localhost:8000/index就可以看到自己开发的第一个接口了

    import flask,os
    server = flask.Flask(__name__)  #把当前这个python文件做为一个服务
    
    @server.route('/error',methods=['get']) #路由
    def cmd():
        cmd = flask.request.values.get('cmd')  #接口的入参
        res = os.popen(cmd)
    
        return res.read()
    
    server.run(host='0.0.0.0',port=8999,debug=True)

    浏览器里输入http://localhost:8999/error?cmd=ipconfig获取到执行命令的结果

    2.再开发一个与数据有交互的的post请求的接口,需要对数据库进行操作,在这里直接引用之前写好的my_db()函数。

    @server.route('reg',methods=['post'])
    def reg():
        username = flask.request.values.get('username')#接收用户的数据
        pwd = flask.request.values.get('passwd')#接收用户数据
        if username and pwd:
            sql = 'select * from my_user where username = "%s"'%username
            if my_db(sql):
                res = {'msg': '该用户已注册', 'msg_code': 2001}
            else:
                insert_sql = 'insert into my_user(username,passwd,is_admin) VALUES  ("%s","%s",0)'%(username,pwd)
                my_db(insert_sql)
                res = {'msg': '注册成功', 'msg_code': 0}
        else:
            res = {'msg':'必填字段未填,请查看接口文档!','msg_code':1001}
        return json.dumps(res,ensure_ascii=False)

    启动该服务后,可用postman验证该接口,注意postman在测试post请求时,参数要写在body里

    点击 send 就可以看到结果了

    注意的一点是: server.run() 一定要放在所有接口的最底下运行,否则,在server.run()以下再开发接口,是检测不到的,不会被运行起来的

    根据之前所学,总结起来说,以上写的接口只能叫做脚本,如果要实现一系列接口的开发,就需要把接口的配置、接口开发需要用到的工具、接口日志、接口需要的参数、数据初始化等等信息分门别类的列出来。

    创建目录如下:

    其中 bin 目录存放启动服务的python文件;

    config存放配置参数,如mysql, redis的连接信息;

    data文件存放sql语句,创建表格或者类似的东西,

    lib 目录存放开发使用到的函数,即工具,还有开发好的接口也放在这里

    logs 目录存放日志文件

    READ_ME就是一个文档,类似说明书的一个作用

    现在我们就按照以上的目录格局来进行接口开发

    1、写一个注册接口:

            1、写一个注册接口,让它的密码存成密文的。

            2、数据存到redis或者mysql里面(开森就好),redis的key就用string类型(user:test1  7869d295e566295b51eec5d6bed67c14 )

            3、test1  7869d295e566295b51eec5d6bed67c14

            4、需要校验用户是否存在

        2、登录接口

            登录成功之后,返回seesionid,用户登录时间

            sessionid

                用户名+当前的时间戳 md5,seesion失效时间是60分钟

            sessionid:test1

                {"seessionid":a5dfcb047721e02a6f8bff779c815165,"login_time":201805051820}

            如果这个用户已经登录过了,那么就返回他的seesionid,登录时间

    思路分析:

    1.在注册接口中会需要操作数据库,需要用到数据库的配置连接信息,我们可以将mysql和redis的连接信息统一写在config文件夹下的配置文件中,因此,我们在config文件下新建一个setting.py的文件,写入配置信息

    #!/usr/bin/env python
    # -*- coding: utf-8 -*-
    MYSQL_INFO = {
        'host': '127.0.0.1',
        'user': 'root',
        'password': '123456',
        'db': 'test',
        'port': 3306,
        'charset': 'utf8'
    }   # MySQL 的配置参数
    
    REDIS_INFO = {
        'host': '127.0.0.1',
        'password': 'HK139bc&*',
        'port': 6379,
        'db': 14
    }     # redis 配置参数
    
    SERVER_PORT = 8000      # 服务端端口

    2.在实现接口过程中用到的函数,可以统一写在lib文件夹下面,我们创建一个tools.py的文件,定义需要用到的函数,例如:密码加密的函数my_md5(),redis操作函数op_redis(),mysql操作函数op_mysql()等等。

    #!/usr/bin/env python
    # -*- coding: utf-8 -*-
    
    import pymysql, redis, hashlib, time
    from config.setting import MYSQL_INFO, REDIS_INFO
    def my_db(sql):    # 传入sql语句,操作数据库
        conn = pymysql.connect( **MYSQL_INFO)
        cur = conn.cursor()
        cur.execute(sql)
        if sql.strip()[:6].upper() == 'SELECT':
            res = cur.fetchall()    # 获取数据库的数据
        else:
            conn.commit()   # 除select语句外的其他语句
            res = 'OK'
        cur.close()
        conn.close()
        return res
    
    def op_redis(k, v=None, seconds=None):  # 操作redis,如果只传入key,则获取value,
        # 如果传入key, value,将key,value写入redis,如果三个参数都有,则写入redis,有时限
        r = redis.Redis( **REDIS_INFO)
        if v and seconds:
            r.setex(k, v, seconds)
            res = 'OK'
        elif v :
            r.set(k, v)
            res = 'OK'
        else:
            if r.get(k):
                res = r.get(k).decode()
            else:
                res = None
        return res
    
    def my_md5(s):  
        md = hashlib.md5()
        md.update(s.encode())
        res = md.hexdigest()
        return res

    3.接下来进行接口代码编写,在lib里新建一个interface.py文件

    @server.route('/my_reg',methods=['post'])
    def my_reg():
        username = flask.request.values.get('username')  #
        pwd = flask.request.values.get('passwd')
        if username and pwd:
            user_key='user:%s'%username
            if op_redis(user_key):
                res = {'msg':'用户已存在!','msg_code':2001}
            else:
                op_redis(user_key,my_md5(pwd))
                res = {'msg': '注册成功!', 'msg_code': 0}
        else:
            res = {'msg': '必填字段未填,请查看接口文档!', 'msg_code': 1001}
        return json.dumps(res, ensure_ascii=False)
    
    @server.route('/my_login',methods=['post'])
    def my_login():
        username = flask.request.values.get('username')  #
        pwd = flask.request.values.get('passwd')
        if username and pwd:
            user_key = 'user:%s' % username
            password = op_redis(user_key)
            if password:    #密码不为空,说明用户是存在的,再校验用户密码是否输入正确
                if my_md5(pwd)==password:   #用户密码输入正确,再校验用户是否已经登录过
                    session_key = 'session:%s' % username
                    if op_redis(session_key):   #若session_key存在,说明用户登录过,返回用户session
                        session = op_redis(session_key)
                        res = json.loads(session)
                    else:
                        sessionID = my_md5(username+str(int(time.time())))
                        login_time = time.strftime('%Y%m%d%H%M%S')
                        res = {'sessionID':sessionID,'login_time':login_time}
    
                        op_redis(session_key,json.dumps(res,ensure_ascii=False),3600)  #用户没登录过,插入用户session和登录时间
                else:
                    res = {'msg': '密码错误!', 'msg_code': 2003}
            else:
                res = {'msg': '用户不存在!', 'msg_code': 2004}
        else:
            res = {'msg': '必填字段未填,请查看接口文档!', 'msg_code': 1001}
        return json.dumps(res, ensure_ascii=False)

    4.这样,大部分工作就算完成了,最后在bin目录创建一个start的python文件,用来启动服务,代码如下

    #!/usr/bin/env python
    # -*- coding: utf-8 -*-
    
    from lib.interface import server
    from config.setting import SERVER_PORT
    
    server.run(
        host='0.0.0.0',
        port= SERVER_PORT,
        debug=True
    )

    5.以上,一个接口就算开发完了,可以看到,我们在文件里引用自己的python文件作为模块,这里需要在pycharm里设置一下,否则可能会报错,

    设置步骤这样那样就完成了,如下图

    点一下,就完成了,这个应该在最最最开始的时候就这样做了。。。。

    6.这样运行此文件值需要启动start.py文件即可,然后就可在浏览器或postman里测试自己所写的接口了

  • 相关阅读:
    解析url
    初学react
    移动端判断用户滑动方向
    冒泡排序、快速排序、数组去重
    Angular Material主题配置
    reset()方法的使用、jq下面reset()的正确使用方法
    conts、var 、let的区别
    NLP
    mybatis的执行流程
    PHP递归算法示例:打印无限级数组元素的值
  • 原文地址:https://www.cnblogs.com/mululu/p/9040102.html
Copyright © 2011-2022 走看看