当前位置:网站首页>flask获取post请求参数
flask获取post请求参数
2022-07-30 14:55:00 【segegefe】
flask获取post请求参数
文章目录
今天 我们继续来说一下, 使用flask web application, 如何获取post 请求参数的。
概述
对于post请求 有几种方式。 Content-Type 实体头部用于指示资源的MIME类型 media type 。
content-type是http请求头的字段。作为请求头时(post或者put),客户端告诉服务器实际发送的数据类型。
对于不同的content-type 发送的数据不太一样,对于服务器端,需要如何获取数据,以及正确解析的方法也是不一样的。
下面列出常用的几种 Content-Type
application/json
application/x-www-form-urlencoded
multipart/form-data
text/plain
text/xml
text/html
1. application/json
Content-Type 以这种方式的api ,目前来说还是比较多的,现在主流前后端交互的api,使用application/json 这种方式 传输数据 非常常见。 主要得意于json 的发展,以及前后端完善的库支持,使得这种方式 比较常见。
这里以login 登录接口为例
http 请求报文格式如下:
POST /login HTTP/1.1
Host: 127.0.0.1:5000
Content-Type: application/json
Content-Length: 59
{
"username":"frank",
"password":"jsdofjdsofjsdo"
}
使用curl
curl --location --request POST 'http://127.0.0.1:5000/login'
--header 'Content-Type: application/json'
--data-raw '{
"username":"frank",
"password":"jsdofjdsofjsdo"
}'
postman 请求

flask如何获取请求体呢
对于这种请求方式 ,flask 如何获取请求的body 的内容呢?
# main.py
from flask import Flask
from flask import request
from flask import jsonify
# pip install pysimple-log
from simplelog import logger
app = Flask(__name__)
@app.route('/login', methods=[ 'POST'])
def login():
if request.method == 'POST':
# 这样获取就可以了
json_data = request.json
logger.info(f"json_data:{json_data}")
return jsonify(json_data)
if __name__ == '__main__':
app.run(host='0.0.0.0', port=5000, debug=True)
我们直接可以通过, flask 提供的request对象获取参数。 request.json 通过这个属性 就可以获取到 request body 的内容了。是不是很方便呢。
2. application/x-www-form-urlencoded
这种方式是 浏览器原生form表单默认的提交方式
http 请求报文格式
POST /login HTTP/1.1
Host: 127.0.0.1:5000
Content-Type: application/x-www-form-urlencoded
Content-Length: 38
username=frank&password=jsdofjdsofjsdo
使用curl 请求
curl --location --request POST 'http://127.0.0.1:5000/login'
--header 'Content-Type: application/x-www-form-urlencoded'
--data-urlencode 'username=frank'
--data-urlencode 'password=jsdofjdsofjsdo'
flask如何获取请求体呢
对于这中content-type 我们可以使用 request.form 返回一个不可变的字典类型。 然后就可以获取 request body 啦。
# 省略 ...
@app.route('/login', methods=[ 'POST'])
def login():
if request.method == 'POST':
json_data = request.form
logger.info(f"json_data:{json_data}")
return jsonify(json_data)
3. multipart/form-data
这又是一个常见的 POST 数据提交的方式。我们使用表单上传文件时,必须让 form 表单的enctype 等于 multipart/form-data。直接来看一个请求示例:
这里我只是演示 一下,对应 http报文
http 请求报文
POST /login HTTP/1.1
Host: 127.0.0.1:5000
Content-Type: multipart/form-data; boundary=----WebKitFormBoundary7MA4YWxkTrZu0gW
Content-Length: 239
----WebKitFormBoundary7MA4YWxkTrZu0gW
Content-Disposition: form-data; name="username"
frank
----WebKitFormBoundary7MA4YWxkTrZu0gW
Content-Disposition: form-data; name="password"
111111sfsfsafsafas==
----WebKitFormBoundary7MA4YWxkTrZu0gW
使用curl 请求
curl --location --request POST 'http://127.0.0.1:5000/login'
--form 'username="frank"'
--form 'password="111111sfsfsafsafas=="'
postman 请求

flask如何获取请求体呢
对于这种方式还是可以通过 request.from 来获取参数
# ... 省略
@app.route('/login', methods=[ 'POST'])
def login():
if request.method == 'POST':
json_data = request.form
logger.info(f"json_data:{json_data}")
return jsonify(json_data)
4. text/plain
用纯文本发送数据
http 请求报文如下
POST /login HTTP/1.1
Host: 127.0.0.1:5000
Content-Type: text/plain
Content-Length: 59
{
"username":"frank",
"password":"jsdofjdsofjsdo"
}
使用curl 请求
curl --location --request POST 'http://127.0.0.1:5000/login'
--header 'Content-Type: text/plain'
--data-raw '{
"username":"frank",
"password":"jsdofjdsofjsdo"
}'
postman 请求

flask如何获取请求体呢
flask 如何正常接收数据呢? 原生的请求数据会放在 request.data 里面,类型是bytes,需要转成字符串,然后通过json 模块转成字典。
import json
from flask import Flask
from flask import request
from flask import jsonify
# pip install pysimple-log
from simplelog import logger
app = Flask(__name__)
@app.route('/login', methods=['POST'])
def login():
if request.method == 'POST':
# bytes 类型
raw_data = request.data
logger.info(f'raw_data:{raw_data}')
json_data = json.loads(raw_data.decode())
logger.info(f"json_data:{json_data},type:{type(json_data)}")
return jsonify(json_data)
结果如下:

可以看出可以正常解析数据了,并且以json 的形式返回了。
总结
本文主要说明了使用flask 框架,如果获取常见的post请求body 数据,今天的分享就到这里了。
参考文档
分享快乐,留住感动. ‘2022-01-09 12:06:45’ --frank
先自我介绍一下,小编13年上师交大毕业,曾经在小公司待过,去过华为OPPO等大厂,18年进入阿里,直到现在。深知大多数初中级java工程师,想要升技能,往往是需要自己摸索成长或是报班学习,但对于培训机构动则近万元的学费,着实压力不小。自己不成体系的自学效率很低又漫长,而且容易碰到天花板技术停止不前。因此我收集了一份《java开发全套学习资料》送给大家,初衷也很简单,就是希望帮助到想自学又不知道该从何学起的朋友,同时减轻大家的负担。添加下方名片,即可获取全套学习资料哦
边栏推荐
- 数据库 - 创建数据库、表、函数等
- TensorFlow自定义训练函数
- HUAWEI CLOUD Releases Open Source Software Governance Service - Software Component Analysis
- Sleuth+Zipkin (visualization) service link tracking
- 软件包 - 笔记
- 元宇宙的前景及四大赛道
- Debug - Notes
- TiUP 命令概览
- JUC common thread pool source learning 02 ( ThreadPoolExecutor thread pool )
- MySQL客户端工具的使用与MySQL SQL语句
猜你喜欢

About the data synchronization delay of MySQL master-slave replication

Sentinel

SQL 优化这么做就对了!

Kubernetes应用管理深度剖析

Memory-mapped, bit-band operations

Mysql数据库查询好慢,除了索引,还能因为什么?

Huawei issues another summoning order for "Genius Boys"!He, who had given up an annual salary of 3.6 million, also made his debut

Alluxio为Presto赋能跨云的自助服务能力

2022最新 | 室外单目深度估计研究综述

存储器映射、位带操作
随机推荐
TiDB 工具功能概览
Kubernetes应用管理深度剖析
Use of InputStream and OutputStream
阿里CTO程立:阿里巴巴的开源历程、理念和实践
The use and principle of distributed current limiting reduction RRateLimiter
延时消息队列
第十一章 api mgmnt API 参考
How do luxury giants such as GUCCI and LV deploy the metaverse, should other brands keep up?
tiup env
Installing and Uninstalling MySQL on Mac
Load Base Split 使用文档
定时任务 corn
科研中一些常用软件清单
TiUP 简介
JVM performance tuning
Huawei issues another summoning order for "Genius Boys"!He, who had given up an annual salary of 3.6 million, also made his debut
canal scrape data
ECCV2022 | FPN错位对齐,实现高效半监督目标检测 (PseCo)
【云原生】灰度发布、蓝绿发布、滚动发布、灰度发布解释
952. 按公因数计算最大组件大小 : 枚举质因数 + 并查集运用题