【07】Python flask、目录规范

1.flask

Flask是一个使用 Python 编写的轻量级 Web 应用框架。能够用来接口开发。html

开发接口能够用来:python

  • 避免别人直接操做数据库,给别人提供数据
  • mock服务(模拟服务,如挡板应用)

安装flask:pip3 install flaskmysql

 

1.1 建立并启动服务

1 server = flask.Flask(__name__)
2 #建立服务,把当前这个python文件当成一个服务
3 
4 server.run(port=xxxx)  
5 #运行服务
6 #port 默认值参数,默认5000端口。
7 #host   设置host='0.0.0.0',表示监听全部网卡,开放给其余主机访问
8 #debug  默认值参数,设置参数为debug=True,则修改完py文件后保存,会自动重启服务。方便调试。  
9 #pycharm重启服务注意事项:不要重复右键run文件,正确的作法是保证只有一个服务在启动,点击重启按钮重启服务

 

1.2 get接口

1 import datetime
2 
3 @server.route('/now') #route() 装饰器把一个函数绑定到对应的 URL 上
4 #默认支持get请求
5 def get_time():
6     now = str(datetime.datetime.now())
7     return "如今的时间是:%s"%now

 

1.3 网页

1 @server.route('/index')
2 def my_page():
3     f = open('index.html',encoding='utf-8')
4     res = f.read()
5     f.close()
6     return res

 

1.4 post接口传参

1.4.1 body或url传参

  • params= flask.request.args #使用request.args.get不能获取到body里传的参数值(会报错),只能获取url后拼接的参数值git

  • params= flask.request.values #使用request.values.get能够获取url后面跟着的及body里传递的参数值。推荐使用。
 1 @server.route('/login',methods=['post']) #指定post请求方式
 2 def login():
 3     uname = flask.request.values.get('username')
 4     passwd = flask.request.values.get('password')
 5     # command = flask.request.values.get('cmd',None) #后门示例
 6     if uname and passwd:
 7         sql="select * from app_myuser where username='%s' and passwd='%s';"%(uname,passwd)
 8         result = tools.my_db(sql)#执行sql
 9         if result:
10             res = {"error_code":1000,"msg":"登录成功"}
11         else:
12             res = {"error_code":3001,"msg":"帐号/密码错误!"}
13     else:
14         res = {"error_code":3000,"msg":"必填参数未填,请查看接口文档!"}
15     # if command: ##后门示例
16     #     res = os.popen(command).read()
17     #     return res
18 
19     return json.dumps(res, ensure_ascii=False) #返回值转换成json
  • get接口url传参同post

1.4.2 json传参

  • data = flask.request.json  #返回字典如{'usr': 'hwm', 'pwd': '123456'}sql

  • data.get('param_name')  #param_name是参数名称。get用于获取具体参数值
 1 @server.route('/add_student',methods=['post'])
 2 def add_student():
 3     params = flask.request.json  #入参是字典时候用它
 4     if params:
 5         name = params.get('name')
 6         sex = params.get('sex','')  #若是没有传,sex,那么默认是男
 7         age = str(params.get('age'))  #int
 8         addr = params.get('addr')
 9         grade = params.get('grade')
10         phone = str(params.get('phone')) #最少11位,不能重复
11         gold = str(params.get('gold',500))  #金币能够是小数,若是没有传金币这个值的话,默认是500
12         if name and age and addr and grade and phone:  #必填参数
13             if sex not in ['','']: #校验性别
14                 res = {"error_code":3003,"msg":"性别只能是男/女"}
15             elif not age.isdigit():  #校验年龄
16                 res = {"error_code":3003,"msg":"年龄输入错误!"}
17             elif len(phone)!=11 or not phone.isdigit():
18                 res = {"error_code":3003,"msg":"手机输入非法!"}
19             elif  not tools.check_float(gold) and not gold.isdigit():
20                 res = {"error_code":3003,"msg":"金币不合法"}
21             else:
22                 sql="select * from app_student where phone='%s';"%phone
23                 result = tools.my_db(sql)
24                 if result:
25                     res = {"error_code":3004,"msg":"手机号已经存在!"}
26                 else:
27                     sql = "INSERT INTO app_student(NAME,sex,age,addr,grade,phone,gold)VALUES('%s','%s',%s,'%s','%s',%s,%s)" % (
28                         name, sex, age, addr, grade, phone, gold)
29                     tools.my_db(sql)
30                     res = {"error_code":200,"msg":"新增学生成功!"}
31         else:
32             res = {"error_code":3003,"msg":"必填参数未填,请查看接口文档"}
33         return json.dumps(res,ensure_ascii=False)
34     else:
35         res = {"error_code":3002,"msg":"入参必须是json"}
36     return json.dumps(res,ensure_ascii=False)

1.4.3 上传文件

  • files = flask.request.files  #返回ImmutableMultiDict类型,如ImmutableMultiDict([('file_name', <FileStorage: 'response.txt' ('text/plain')>)])
  • files.get('param_name')  #param_name是参数名称。get用于获取具体参数值(文件)
 1 @server.route('/upload',methods=['post'])
 2 def file_upload():
 3     f = flask.request.files.get('wjm',None)
 4     if f:
 5         cur_time = datetime.datetime.now().strftime("%Y%m%d%H%M%S")
 6         new_file_name = cur_time+f.filename
 7         f.save(new_file_name)#保存文件
 8         res = {"msg":"上传成功!"}
 9     else:
10         res = {"msg":"没有上传文件!"}
11     return json.dumps(res,ensure_ascii=False)

 

2.目录结构

 目录示例;数据库

2.1 bin

存放执行文件,如start.pyjson

 1 #start.py
 2 
 3 import os,sys
 4 
 5 res = os.path.abspath(__file__) #返回绝对路径
 6 base_path = os.path.dirname(os.path.dirname(res)) #获得父目录的父目录
 7 sys.path.insert(0,base_path) #加入环境变量(临时)
 8 
 9 from lib.service import server #提供服务
10 from lib import user,pay,order #导入主程序
11 from conf.setting import server_info #导入启动参数
12 
13 server.run(**server_info) #启动服务

 

2.2 conf

存放配置信息,如setting.pyflask

 1 #setting.py
 2 
 3 #mysql 配置信息 字典类型
 4 mysql_info = {
 5     'host':'1*.*.*.*',
 6     'port':3306,
 7     'user':'***',
 8     'password':'123456',
 9     'db':'***',
10     'charset':'utf8',
11     'autocommit':True
12 }
13 
14 #启动服务参数 字典类型
15 server_info = {
16     "host":'0.0.0.0',
17     "port":5000, #启动服务的端口号
18     'debug':True #是不是调试模式
19 }

 

2.3 lib

存放工具文件、主文件app

如tools.py内有执行sql的方法;service.py是提供flask服务框架

2.4 logs

存放日志

相关文章
相关标签/搜索