一、请求对象
在Flask中,由全局对象request提供请求信息。我们可以使用dir()方法查看request对象的所有属性:
常用的属性有method(用于获取前端请求的方法),args(用于获取url中提交的参数)等。示例:
前端请求:
后端解析请求,根据输出可以看到请求方式是get方式,url中提交的参数是userid,且值为123456:
1.文件上传
在Flask中,上传文件首先要设置提交请求的<form>具有enctype="multipart/form-data"
属性(enctype: encoding type)。
1.已上传的文件存储在内存的临时位置,可以使用 request.files['the_file']来访问上传的文件。'the_file'名字要与前端传递过来的名字一致。
2.可以使用filename属性查看文件上传之前在客户端系统中的名字。但是这个值是可以伪造的,永远不可信。如果依然要使用上传的文件名作为文件的保存名字,可以使用Werkzeug的secure_filename()函数——当然,这样做是不推荐的。
3.使用save()方法可以将上传的文件保存到指定位置。
编写视图函数,并在/flask_demo/static/下新建upload目录用于存放上传的文件。
# -*- coding:utf-8 -*-
from flask import Flask
from flask import render_template
from flask import request
from werkzeug.utils import secure_filename
app = Flask(__name__)
@app.route('/upload', methods=['GET', 'POST'])
def upload_file():
if request.method == 'POST':
f = request.files['my_file']
print('上传的文件名为:'+f.filename) # 查看文件名
f.save('./static/upload/' + secure_filename(f.filename))
return '上传完毕'
else:
return render_template('index.html', name='Flask')
if __name__ == '__main__':
app.run()
浏览器访问http://127.0.0.1:5000/upload,前端页面显示如下:
最后在前端页面点击“选择文件”按钮并选择文件,然后点击“提交文件”按钮进行提交,结果如下:
二、响应
视图函数的返回值会自动转换为一个响应对象。转换规则如下:
- 如果视图返回的是一个响应对象,那么就直接返回它。
- 如果返回的是一个字符串,那么根据这个字符串和缺省参数生成一个用于返回的 响应对象。
- 如果返回的是一个元组,那么元组中的项目可以提供额外的信息。元组中必须至少 包含一个项目,且项目应当由
(response, status, headers)
或者(response, headers)
组成。status
的值会重载状态代码,headers
是一个由额外头部值组成的列表或字典。- 如果以上都不是,那么 Flask 会假定返回值是一个有效的 WSGI 应用并把它转换为 一个响应对象。
1.make_response()
如果想在视图函数内部修改响应对象,那么可以使用make_response()。视图函数:
请求结果:
修改视图函数成如下:
修改后的请求结果:
2.redirect()
Flask中使用redirect()函数可以实现重定向。例如访问某个页面的时候,判断是否登陆,没有登陆就跳转到登陆页面。
3.abort()
根据给定的状态码或者WSGI应用触发HTTP异常。提前退出请求。示例:
视图函数:
请求结果:
参考资料
[1] Flask API文档,request: https://dormousehole.readthedocs.io/en/latest/api.html#flask.Request
[2] Flask API文档, make_response(): https://dormousehole.readthedocs.io/en/latest/api.html#flask.make_response
[3] Flask API文档, redirect(): https://dormousehole.readthedocs.io/en/latest/api.html#flask.redirect
[4] Flask API文档, abort(): https://dormousehole.readthedocs.io/en/latest/api.html#flask.abort