方法一、接口开发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是修改代码后自动重启