Flask:获取请求数据

HTTP支持多个请求方法,最常用的有两种:GETPOST,GET请求的数据一般通过URL的方式传递给服务器,由于URL的长度有限制所以传递的数据量有限;而POST通过请求消息体把数据传递给服务器,所以理论上来说对数据量大小没有限制。

其他常见请求方法: HEAD(与GET请求方式一样,但是只处理请求头消息)、DELETE(多用于REST中,表示删除一个资源)、PUT(多用于REST中,表示添加一个资源)

消息传递格式:

  • GET:URL?参数名=参数值
  • POST:参数名=参数值

多个参数名值对之间通过 & 进行分隔

请求方法限定

在Flask中默认情况下绑定的URL只处理 GET 请求,如果想要其支持其他请求可以在绑定的时候通过传入 methods 参数来指定支持的方法列表

1
2
3
@app.route("URL规则", methods=["请求方法"])

app.add_url_rule("URL规则", view_func=处理函数, methods=["请求方法"])

可以看到methods参数值是一个List类型,所以可以指定多个方法

获取请求参数

在Flask中获取请求参数需要导入 request 通过它就可以获取请求信息,而在Django中请求对象由框架构造好后传入视图函数,而Flask设计者认为这样会污染视图函数,视图函数参数列表只需要列出处理逻辑关注的核心参数。

对于每个请求Web服务器都会生成一个新的线程来处理用户请求,Flask会将请求消息封装进当前线程绑定的request中,这样每个请求拿到的request对象封装的信息都不一样。查看源代码发现request对象是一个本地代理对象(LocalProxy),其内部通过类似threading.local()的方式存储线程内数据。

获取GET请求参数

定义一个视图函数,让其支持GET和POST两种方式提交

1
2
3
4
5
6
7
8
9
10
11
from flask import Flask, request

app = Flask(__name__)

@app.route("/", methods=["GET","POST"])
def index():
nickname = request.args.get("nickname")
return "Hello %s" % nickname

if __name__ == "__main__":
app.run()

注: request.args是一个字典,所以你也可以这样获取参数值:request.args[“参数名”]

测试: 直接在浏览器输入访问地址后加上?nickname=harmel即可,harmel就是传递过去的值

获取POST请求参数

在GET请求代码基础上更改一行代码,将 args 改为 form

1
nickname = request.form.get("nickname")

注: request.form是一个字典,所以你也可以这样获取参数值:request.form[“参数名”]

测试: 由于POST提交的数据通过请求体进行传递,为了测试方便一般通过HTML的表单进行传递

1
2
3
4
<form method="post" action="http://127.0.0.1:5000">
<input name="nickname" type="text">
<input type="submit" value="POST">
</form>

用浏览器打开这个HTML页面,输入想要传递的值点击POST按钮即可,如果你的浏览器安装了HTTP测试插件也可以通过插件来测试,或者通过原始的telnet命令来测试。

文件上传

1
2
3
4
5
6
7
8
9
10
11
12
from flask import Flask, request

app = Flask(__name__)

@app.route("/", methods=["GET","POST"])
def index():
bio = request.files["bio"]
bio.save("d:/" + bio.filename)
return "OK"

if __name__ == "__main__":
app.run(debug=True)

注: 由于文件名可能伪造,如果想获取实际的文件名一般通过如下方式

1
2
from werkzeug import secure_filename
bio.save("d:/" + secure_filename(bio.filename))

在实际项目中一般将上传的文件名命名为一UUID值,在数据库表中保存UUID和文件的实际名

获取请求头信息

在GET请求代码基础上更改一行代码,将 args 改为 headers

1
user_agent = request.headers.get("User-Agent")

注: request.headers是一个字典,所以你也可以这样获取参数值:request.headers[“参数名”]

  • 本文作者: Harmel
  • 本文链接: http://www.harmel.cn/2018/08/flask-request.html
  • 版权声明: 文章如无特别说明,则表明该文章为原创文章,如需要转载,请注明出处。
  • 本站说明: 本站使用阿里云服务器,如果您喜欢我的网站,欢迎收藏,能捐赠支持一下就再好不过了。