接口开发
接口开发
flask是一个轻量级的接口开发模块,在进行接口开发之前需要先安装flask模块,安装命令如下:
pip install flask
下面是flask用法介绍
import flask,json
server = flask.Flask(__name__) #__name__表示当前Python文件
@server.route('/login') #装饰器,表示下面的函数就是接口了
def welcome():
data = {'code':200,'msg':'meteor登录成功','session_id':'asdfasdfjuiasdfjlkad'}
return json.dumps(data,ensure_ascii=False)
@server.route('/test1') #装饰器,表示下面的函数就是接口了
def test1():
data = {'code':100,'msg':'test success'}
return json.dumps(data)
@server.route('/')
def index():
str = '<h1><a href="http://www.baidu.com">点</a></h1> <input />' \
'<button>点我!! </button>'
return str
@server.route('/urldata') #get请求,参数在url里
def urlData():
u = flask.request.args.get('username') #url
p = flask.request.args.get('password') #url
data = {'username':u,'password':p}
return json.dumps(data,ensure_ascii=False)
@server.route('/post',methods=['post']) #post请求
def post():
u = flask.request.args.get('username') # url
p = flask.request.args.get('password') # url
stu_name = flask.request.values.get('stu_name')
addr = flask.request.values.get('addr')
data = {'username':u,'password':p,'stu_name':stu_name,'addr':addr}
return json.dumps(data,ensure_ascii=False)
@server.route('/api/add_stu',methods=['post'])
def stu():
name = flask.request.values.get('name')
age = flask.request.values.get('age')
classes = flask.request.values.get('classes')
addr = flask.request.values.get('addr')
sex = flask.request.values.get('sex')
phone = flask.request.values.get('phone')
data = {'name':name,'age':age,'classes':classes,'sex':sex,'phone':phone}
return json.dumps(data,ensure_ascii=False )
#入参是json的
@server.route('/api/add_stu2',methods=['post'])
def stu2():
if flask.request.is_json:
name = flask.request.json.get('name')
age = flask.request.json.get('age')
classes = flask.request.json.get('class')
addr = flask.request.json.get('addr')
sex = flask.request.json.get('sex')
phone = flask.request.json.get('phone')
print(flask.request.json)
return json.dumps({'msg':'添加成功'},ensure_ascii=False)
else:
return json.dumps({'msg':'入参请传入json'},ensure_ascii=False)
#上传文件的
@server.route('/file',methods=['post'])
def uploadFile():
file = flask.request.files.get('file')
print(file.filename) #获取到上传的文件名
file.save(file.filename)
return json.dumps({'msg':'上传完成!'},ensure_ascii=False)
server.run(host='0.0.0.0',port=8888,debug=True) #默认端口号是5000 debug=True改完代码会自动重启
以上代码都是写在一个Python文件中的,一般真正进行开发的时候不会讲所有代码都写在一个Python文件中,各个工程或者项目会根据实际情况建立多个文件夹,分别存在配置信息,引用的函数,接口信息等,下面举例介绍:
- 先建立一个文件夹,如szz_api
- 这个文件夹下分别建立config、lib、log文件夹
- 建立main.py文件和read.txt文件
- config文件夹下建立setting.py文件
- b文件夹下建立interface.py和tools.py文件
最后目录结构如下:
szz_api/
├── config
│ └── setting.py
├── lib
│ ├── interface.py
│ └── tools.py
├── log
├── main.py
└── read.txt
下面我们来看一下每个文件中的内容
setting.py(这里面存的都是配置信息):
mysql_info = {
'host': 'IP #IP
'port': 3306, #端口
'password': '123456', #密码
'user': 'xxx #账号
'db': 'xxx #数据库
'charset': 'utf8',
'autocommit': True
}
redis_info = {
'host':'IP #IP
'port':6379, #端口
'passwd':'Hxxx#密码
'db':9 #数据库
}
SALT='$%*^(2dfsdfaf' #盐
#接口
server_info = {
'port':8888, #端口号
'debug':True, #是否调试模式
'host':'0.0.0.0' #绑定IP
}
tools.py(这里面都是需要用到的函数、模块):
import hashlib,pymysql
from config import setting #从config文件夹下引用setting文件
def md5(s,):
s = (str(s)+setting.SALT).encode()
m = hashlib.md5(s) #加密
return m.hexdigest()
def op_mysql(sql:str):
result = '执行完成'
conn = pymysql.connect(**setting.mysql_info)
cur = conn.cursor(pymysql.cursors.DictCursor) #建立游标
cur.execute(sql)
if sql.strip().lower().startswith('select'):
# result = cur.fetchone()
result = cur.fetchall()
cur.close()
conn.close()
return result
interface.py(这里面都是接口相关的代码):
import flask,json
from . import tools #从当前位置引用tools
server = flask.Flask(__name__)
@server.route('/table_data')
def get_table_data():
table_name = flask.request.args.get('table_name')
limit = flask.request.args.get('limit','10')
if not table_name:
return json.dumps({'msg':'table_name是必填字段'},ensure_ascii=False)
if limit.isdigit():
sql = 'select * from %s limit %s;' % (table_name, limit)
else:
return json.dumps({'mgs':'limit请传入一个整数'},ensure_ascii=False)
if table_name not in ['app_myuser','dsk_test','app_student','app_product']:
return json.dumps({'msg':'没有权限获取该表数据'},ensure_ascii=False)
resault = tools.op_mysql(sql)
return json.dumps(resault,ensure_ascii=False)
@server.route('/add_mem',methods=['post'])
def add_mem():
username = flask.request.json.get('username')
password = flask.request.json.get('password')
if username and password:
sql = 'select * from app_myuser where username = "%s";'%username
if tools.op_mysql(sql):
data = {'msg':'用户已存在'}
else:
new_password = tools.md5(password)
insert_sql = 'insert into app_myuser (username,passwd) values ("%s","%s");'%(username,new_password)
tools.op_mysql(insert_sql)
data = {'msg':'用户添加成功'}
else:
data = {'msg':'必填参数未填,请查看接口问题'}
return json.dumps(data,ensure_ascii=False)
main.py(这里是程序的入口):
import sys
import os
BASE_PATH = os.path.dirname(os.path.abspath(__file__)) #获取当前文件的父目录的绝对路径
sys.path.insert(0,BASE_PATH) #将上面取到的路径添加到系统PAHT变量里面
from lib.interface import server #导入lib文件夹里interface里的server方法
from config.setting import server_info #导入config文件夹下setting里的server_info变量
server.run(**server_info)
最后还有一个read.txt,这里面存放的是整个工程的说明:
#这个程序是写xxx接口的
入库是main.py
config下是配置文件
lib是程序的主逻辑在这里面
还有一个log文件夹未使用,待续。