请求数据获取与相应
1.1 请求数据及其获取
- 回忆
http
协议
-
请求参数位置
- 请求行
- 请求头
- 请求体
-
请求参数列表 (request)
序号 参数或信息 解释 1 固定参数 URL的组成部分, 不可缺失 2 查询字符串: args 根据需求, get 3 表单数据: form 提交form表单是传递的数据 post 4 文件上传: files 用户向服务器上传的文件 post 5 请求头: headers 请求头中携带的请求信息 6 请求方法: method 请求所使用的的请求方法 7 URL地址: url 请求的URL地址 8 get_json() 获取json数据 -
固定参数与转换器
- 自定义转换器
class MyCover(BaseConverter): def __init__(self, *args, **kwargs): super().__init__( *args, **kwargs) print(args[0]) print(**kwargs) self.regx = args[0] regx = r"^1[3-9]\d{9}$" app.url_map.converters['mycover'] = MyCover
- 固定参数(放在url的参数)
@app.route("/mycover/<age>")
def index(age):
print(type(age))
int(age)
return "王xx,今年{}岁".format(age)
- 请求参数(放在请求头或者请求体中的参数)
# get 请求中
request.args.get("key")
# post 请求
request.form.get("key")
# 接收json数据
request.get_json()
-
内置转换器
@app.route('/index/<int:user_id>',methods=['GET']) def index(user_id): print(user_id) return 'hello world'
字段 默认值 string (默认值)接收没有任何斜杠的文本 int 接收整型 float 接收浮点型 path 接收string,但是也接收斜线 uuid 接收 uuid 的字符串 -
自定义转换器
from flask import Flask, request from werkzeug.routing import BaseConverter app = Flask(__name__) class MyCover(BaseConverter): def __init__(self,parm1,*args): super().__init__(parm1) self.regex = args[0] app.url_map.converters['re'] = MyCover @app.route('/<re("[\w]+"):name>') def showinfo(name): print(name) return '这是自定义的转换器应用' if __name__ == '__main__': app.run(debug=True)
http://127.0.0.1:5000/13511062387
-
文件上传
-
获取文件对象
file_obj = request.files.get('key')
-
文件对象的属性
file_obj.filename: 上传文件的文件名 file_obj.name: 上传文件指定的 key file_obj.save('path'): 文件对象保存方法
-
完整代码
# 格式化时间 def fmt_time(): return datetime.datetime.now().strftime("%Y%m%d%H%M%S") # 获取后缀名 def ext_name(filename): return "."+filename.split(".")[-1] # 文件上传 @app.route('/upload',methods=['POST']) def upload(): # 接收前端传来的参数 file_storage = request.files.get("key") # 获取文件名称 filename = file_storage.filename # 给文件重命名 2021033114018563254896.png refilename = fmt_time() + ext_name(filename) # 保存数据,指定目标地址 file_storage.save(dst=refilename) # 返回 return "upload success"
-
1.2 响应数据之新手三件套(熟悉)
-
字符串响应形式
# 字符串 直接使用return关键字返回一个字符串: return 'hello flask'
-
模板响应形式
render_template('页面路径')
-
重定向响应形式 临时重定向(302)
redirect("远程地址")
-
使用 endpoint 值重定向
redirect(url_for('idx'))
1.3 响应json数据与元组数据
-
json数据响应
返回json数据需要借助flask提供的jsonify来实现
jsonify({})
-
元组返回形式
可以返回一个元组,这样的元组必须是 (response, status, headers) 的形式,且至少包含一个元素。 status 值会覆盖状态代码, headers 可以是一个列表或字典,作为额外的消息标头值。
return ('要返回的字符串', 6969, {'author': 'jeremy'})
1.4 make_response自定义响应
-
make_response()
flask可以返回make_response自定义的响应, make_response()内部需要传递返回的字符串, 其创建的对象还有headers属性用于设置响应头, status属性用于设置状态码
-
完整代码
@app.route('/index', endpoint='idx') def index(): # 响应字符串 resp = make_response('自定义的响应字符串') # 响应头键值对 resp.headers['author'] = 'jeremy' # 状态码与状态码提示信息 resp.status = '6969 a post' # 注意: 响应头键值对与状态码提示信息均为英文, 否则抛异常 return resp