Flask获取POST方法传来的数据

来自CloudWiki
跳转至: 导航搜索

Flask获取POST数据

Flask服务端

以用户注册为例子,我们需要向服务器/register传送用户名name和密码password。如下编写HelloWorld/server.py


from flask import Flask, request

app = Flask(__name__)


@app.route('/')
def hello_world():
    return 'hello world'


@app.route('/register', methods=['POST'])
def register():
    print(request.headers)
    print(request.stream.read())

    return 'welcome'

@app.route('/register', methods=['POST'])是指url/register只接受POST方法。可以根据需要修改methods参数,例如如果想要让它同时支持GET和POST,这样写:

@app.route('/register', methods=['GET', 'POST']) 

模拟浏览器端

浏览器模拟工具client.py内容如下:

import requests

user_info = {'name': 'letian', 'password': '123'}
r = requests.post("http://127.0.0.1:5000/register", data=user_info)

print(r.text)

运行测试

运行HelloWorld/server.py,然后运行client.py。client.py将输出:

welcome

而HelloWorld/server.py在终端中输出以下调试信息(通过print输出):

Host: 127.0.0.1:5000

User-Agent: python-requests/2.23.0

Accept-Encoding: gzip, deflate

Accept: */*

Connection: keep-alive

Content-Length: 24

Content-Type: application/x-www-form-urlencoded




b'name=letian&password=123'

前6行是client.py生成的HTTP请求头,由print(request.headers)输出。

请求体的数据,我们通过print(request.stream.read())输出,结果是:

b'name=letian&password=123'

Flask解析POST数据

解析简单数据

上面,我们看到post的数据内容是:

 b'name=letian&password=123'

我们要想办法把我们要的name、password提取出来,怎么做呢?自己写?不用,Flask已经内置了解析器request.form。

我们将服务代码改成:

from flask import Flask, request

app = Flask(__name__)


@app.route('/')
def hello_world():
    return 'hello world'


@app.route('/register', methods=['POST'])
def register():
    print(request.headers)
    # print(request.stream.read()) # 不要用,否则下面的form取不到数据
    print(request.form)
    print(request.form['name'])
    print(request.form['password'])
    print(request.form.get('name'))
    print(request.form.get('password'))
    print(request.form.get('nickname', default='little apple'))
    return 'welcome'


if __name__ == '__main__':
    app.run(port=5000)

执行client.py请求数据,服务器代码会在终端输出:

Host: 127.0.0.1:5000

User-Agent: python-requests/2.23.0

Accept-Encoding: gzip, deflate

Accept: */*

Connection: keep-alive

Content-Length: 24

Content-Type: application/x-www-form-urlencoded




ImmutableMultiDict([('name', 'letian'), ('password', '123')])
letian
123
letian
123
little apple

request.form会自动解析数据。

request.form['name']和request.form.get('name')都可以获取name对应的值。对于request.form.get()可以为参数default指定值以作为默认值。所以:

 print(request.form.get('nickname', default='little apple'))

输出的是默认值

little apple

解析组合数据

如果name有多个值,可以使用request.form.getlist('name'),该方法将返回一个列表。


我们将client.py改一下,传递一个列表:

import requests

user_info = {'name': ['letian', 'letian2'], 'password': '123'}
r = requests.post("http://127.0.0.1:5000/register", data=user_info)

print(r.text)

此时我们Server端代码可以这样改:

from flask import Flask, request

app = Flask(__name__)


@app.route('/')
def hello_world():
    return 'hello world'


@app.route('/register', methods=['POST'])
def register():
    print(request.headers)
    # print(request.stream.read()) # 不要用,否则下面的form取不到数据
    print(request.form)
    print(request.form.getlist('name'))
    return 'welcome'


if __name__ == '__main__':
    app.run(port=5000)


此时运行client.py,服务端将输出:

[u'letian', u'letian2']

参考文档: https://www.letianbiji.com/python-flask/py-flask-post-data.html