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里测试自己所写的接口了

原文地址:https://www.cnblogs.com/mululu/p/9040102.html