获取POST数据

获取POST方法传送的数据

作为一种HTTP请求方法,POST用于向指定的资源提交要被处理的数据。

比如: 我们在某网站注册用户、写文章等时候,需要将数据传递到网站服务器中。并不适合将数据放到URL参数中,密码放到URL参数中容易被看到,文章数据又太多,浏览器不一定支持太长长度的URL。这时,一般使用POST方法。

本课程使用python的requests库模拟浏览器。

安装方法:

pip install requests

看POST数据内容

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

from flask import Flask, request

app = Flask(__name__)

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

def register():

    print(request.headers)

    print(request.stream.read())

    return 'welcome'

if __name__ == '__main__':

    app.run(port=5000, debug=True)

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

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

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

import requests

user_info = {'name': 'Loen', 'password': 'loveyou'}

r = requests.post("http://127.0.0.1:5000/register", data=user_info)

print(r.text)

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

welcome

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


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

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

b'name=Loen&password=loveyou'


解析POST数据

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

b'name=Loen&password=loveyou'

我们要想办法把我们要的name、password提取出来,怎么做呢?

Flask已经内置了解析器request.form。

我们将服务代码改成:

from flask import Flask, request

app = Flask(__name__)

@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.get('name'))

    print(request.form.getlist('name'))

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

    return 'welcome'

if __name__ == '__main__':

    app.run(port=5000, debug=True)

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


request.form会自动解析数据。

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

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

输出的是默认值

little apple


获取POST中的列表数据

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

import requests

user_info = {'name': ['Loen', 'Alan'], 'password': 'loveyou'}

r = requests.post("http://127.0.0.1:5000/register", data=user_info)

print(r.text)

此时运行client.py,print(request.form.getlist('name'))将输出:

[u'Loen', u'Alan']

你可能感兴趣的:(获取POST数据)