python-接口开发

 

 方法一、接口开发fastapi、uvicorn

 

可直接访问自动生成的接口地址:http://启动ip:启动端口号/docs,类似swagger文档,可直接测试接口

 

import fastapi
import uvicorn
server = fastapi.FastAPI()

@server.get('/login')
def login(username:str,password:str):
    if username.strip() and password.strip():
        p = tools.my_md5(password)
        sql = 'select * from app_myuser where username="%s"and passwd="%s";' % (username,p)
        if tools.execute_sql(sql):
            return {'code': 0, 'msg': '登陆成功!'}
        else:
            return {'code': -1, 'msg': '用户/密码错误!'}
    else:
        return {"code":-1,"msg":"必填参数未填!"}


@server.get('/test')
def test():
    return {"212":"登陆成功!"}


@server.get('/pay')
def test(money:float,status='1'):
    if status=='0':
        return {"code":1,"status":"fail"}
    elif status=='1':
        return {"code":0,"status":"success","balance":money}


@server.post('/reg')
def reg(username: str, password: str, cpassword: str):
    if username.strip() and password.strip() and cpassword.strip():
        if password.strip() != cpassword.strip():
            return {'code': -1, 'msg': '两次输入的密码不一样'}
        else:
            sql = 'select * from app_myuser where username="%s";' % username
            if tools.execute_sql(sql):
                return {'code': -1, 'msg': '用户已经存在'}
            else:
                p = tools.my_md5(password)
                insert_sql = 'insert into app_myuser (username,passwd) value ("%s","%s");' % (username, p)
                tools.execute_sql(insert_sql)
                return {'code': 0, 'msg': '注册成功!'}

    else:
        return {'code': -1, 'msg': '必填参数不能为空'}

uvicorn.run(server,port=8888,debug=True,host='0.0.0.0')

 

 

 

tools.py

 

import pymysql,xlwt
import traceback
import hashlib
MYSQL_INFO = {
    'host':'ip',
    'user':'',
    'password':'',
    'db':'',
    'charset':'utf8',
    'autocommit':True
}

def execute_sql(sql):
    conn = pymysql.connect(**MYSQL_INFO) #xx=xxx,xx=xx,
    cur = conn.cursor(pymysql.cursors.DictCursor)
    try:
        cur.execute(sql)
    except:
        print('sql不正确')
        traceback.print_exc()
    else:
        return cur.fetchall() #None  []
    finally:
        conn.close()
        cur.close()

def my_md5(s):
    s = str(s)
    s = s.encode()
    m = hashlib.md5(s)
    result = m.hexdigest()
    return result

 

 访问:   http://127.0.0.1:8888/docs  如下图:

 

 

 

 

方法二、接口开发flask

先安装一个模块:pip install flask  用它来启动一个服务,flask是一个web框架

1、知道接口是怎么开发的
2、避免别人操作你的数据库
3、mock服务(模拟一个服务)

一个简单的接口:

1 import flask
2 server = flask.Flask(__name__)#把当前这个python文件当做一个服务
3 @server.route('/login',methods=['get','post'])#装饰器
4 def zjr():
5     return '登录成功!'
6 server.run(port=8989,debug=True)#启动服务,端口号为8989,修改后自动重启

启动后:

重新运行只能启动一个,否则端口号会重复,点击服务网址,加域名(http://127.0.0.1:8989/login)

 访问服务:http://127.0.0.1:8989/login

 

 用postman访问接口

写死的参数:

1 import flask
2 import json
3 server = flask.Flask(__name__)#把当前这个python文件当做一个服务
4 @server.route('/login',methods=['get','post'])#装饰器
5 def zjr():
6     res = {'code':1000,'msg':'登录成功!','sign':'sbhjsgurhuheuih'}#创建了一个字典
7     return json.dumps(res,ensure_ascii=False)#不能直接返回字典,需要用json.dumps转成json串
8 #ensure_ascii=False加这个参数,可以返回中文
9 server.run(port=8989,debug=True)#启动服务,端口号为8989,修改后自动重启

带参数传入的:

import flask
import json
server = flask.Flask(__name__)#把当前这个python文件当做一个服务
@server.route('/login',methods=['get','post'])#装饰器,下面的函数不是普通的函数而是个接口
def zjr():
    username = flask.request.values.get('username')#是从客户端发过来的数据  
    pwd = flask.request.values.get('password')  
    if username=='zjr' and pwd == '123456':  
        res = {'code': 1000, 'msg': '登录成功!', 'sign': 'sbhjsgurhuheuih'} # 创建了一个字典   
    else: 
        res = {'code': 2000, 'msg': '账号/密码错误!'} # 创建了一个字典 
    return json.dumps(res,ensure_ascii=False)#不能直接返回字典,需要用json.dumps转成json串 #ensure_ascii=False加这个参数,可以返回中文       
 server.run(port=8989,debug=True)#启动服务,端口号为8989,修改后自动重启

 

 

用postman传参(k-v):

json、cookie、headers传参:

1 json_data = flask.request.json.get()#'获取入参是json类型的'
2 flask.request.cookies.get('xxx')#获取cookie
3 flask.request.headers.get('xxx')#获取headers
 

 

练习:

用30行代码开发一个上传、下载文件的接口

分享一段代码,开发了3个接口:
            1、上传文件
            2、查看所有文件
            3、下载文件

使用python开发,需要安装flask模块,使用pip install flask安装即可,代码量特别少,就能实现,加上注释总共35行代码,特别的简单,代码如下:

import flask,os,time
from flask import request,send_from_directory,jsonify
app = flask.Flask(__name__)#创建一个app,代表这个web服务
@app.route('/get_file',methods=['get'])
def get_file():
    #下载文件接口
    filename = request.values.get('fname',None)
    #获取需要下载的文件名
    if filename:#如果获取到的文件名话
        if os.path.isfile(filename):#判断是否是一个文件
            #返回要下载的文件
            return send_from_directory('.',filename,as_attachment=True)
        else:
            return jsonify({"msg":"文件不存在!"})
    else:
        return jsonify({'msg':'文件名不能为空'})
@app.route('/files',methods=['get'])
def file_list():
    #获取文件列表接口
    files = os.listdir('.')#获取当前目录下所有文件
    new_files = [f for f in files if os.path.isfile(f)]
    #三元运算符,把是文件的放到list中
    return jsonify({"files":new_files})
@app.route('/upload',methods=['post'])
def upload():
    #上传文件接口
    f = request.files.get('file_name',None)
    if f:
        t = time.strftime('%Y%m%d%H%M%S')#获取当前时间
        new_file_name = t+f.filename#给文件重命名,防止有重复文件覆盖
        f.save(new_file_name)#保存文件
        return jsonify({"code":"ok"})
    else:
        return jsonify({"msg":"请上传文件!"})
app.run(debug=True,port=8888)#启动这个web服务

 

 

 

练习注册的接口

 1 import flask,pymysql
 2 import json,hashlib
 3 server = flask.Flask(__name__)#把当前这个python文件当做一个服务
 4 
 5 #操作数据库的函数
 6 def my_db(sql,port=3306,charset='utf8'):
 7     ip,user,passwd,db = '数据库ip','数据库用户','密码','数据库名字'
 8     coon = pymysql.connect(host=ip,user=user,
 9                     password=passwd,
10                     db = db,
11                     port=port,
12                     charset=charset,
13                     autocommit=True
14                     )
15     cur = coon.cursor()
16     sql=sql.strip()
17     cur.execute(sql)
18     sql_start = sql[:6].lower()#取SQL的开头6位,转换成小写
19     if sql.startswith('select') or sql.startswith('show'):
20         data = cur.fetchall()
21     else:
22         data ='ok'
23     cur.close()
24     coon.close()
25     return data
26 
27 #MD5加密函数
28 def my_md5(s):
29     m = hashlib.md5(s.encode())
30     return m.hexdigest()
31 
32 @server.route('/register',methods=['post'])
33 def reg():
34     username = flask.request.values.get("username")  # 是从客户端发过来的数据
35     passwd = flask.request.values.get("passwd")
36     cpasswd = flask.request.values.get("cpasswd")
37     if username and passwd and cpasswd:
38         sql1 = 'select * from nhy where name="%s";'%username#数据库里是双引号“”
39         sql_res = my_db(sql1)
40         if sql_res:
41             res = {'code':2001,'msg':'该用户已经被注册'}
42         else:
43             if passwd==cpasswd:
44                 md5_pwd = my_md5(passwd)
45                 sql2='insert into nhy(name,pwd) value("%s","%s");'%(username,md5_pwd)
46                 my_db(sql2)
47                 res = {'code':1000,'msg':'注册成功!'}
48             else:
49                 res = {'code': 20003, 'msg': '两次密码不一致!'}
50     else:
51         res = {'code':20002,'msg':'必填参数未填,请查看接口文档!'}
52     return json.dumps(res,ensure_ascii=False)
53 
54 server.run(port=8989,debug=True)#启动服务,接口写完了启动一次;debug=True是修改代码后自动重启

 

 

 

 

 

 

 


posted @ 2018-07-21 22:34  Mezhou  阅读(520)  评论(0编辑  收藏  举报