# encoding=utf-8
"""
1、request对象:获取原始请求信息数据对象
(01)request.user_agent:获取用户代理,包含用户的客户端类型,操作系统类型等信息
(02)request.headers:获取一个Werkzeug的EnvironHeaders对象,包含首部字段,可以以字典的形式操作
(03)request.application:获取服务器请求的应用类型
(04)request.charset:获取请求的编码格式
(05)request.url-charset:获取使用url的编码格式
(06)request.host:获取服务器请求的主机地址
(07)request.host_url:获取服务器请求的完整主机地址(包括协议)
(08)request.base_url:获取url的基础地址(?参数之前的地址)
(09)request.url:获取浏览器的完整url地址
(10)request.url_root:获取浏览器的根url
(11)request.path:查看浏览器匹配的路由(路由路径)
(12)request.full_path:查看浏览器传递给Flask服务的数据(路由+参数)
(13)request.blueprint:获取项目当前使用蓝图的信息
(14)request.endpoint:获取与当前请求相匹配的端点值
(15)request.referrer:获取浏览器请求发起的源URL
(16)request.scheme:获取请求的URL模式/协议(http或https)
(17)request.method:获取浏览器请求的http方法(get/post)
(18)request.cookies:获取一个包含索引随请求提交的cookies字典校验
(19)request.args:获取get请求方法的类字典参数信息
A、可以获取到Werkzeug的ImmutableMultiDict对象,存储解析后的查询字符串,可通过字典的方式获取键和值
B、要想获取未解析的原生查询字符串,可以使用query_string属性
C、request.args.get(需求键):可以找到键时,可以通过指定键获取到数据;无法找到键时,request会返回None,Flask服务器会报500错误
D、request.args.get(需求键,默认值):为其设置默认值,无法获取到键时直接使用默认值
E、request.args.getlist(需求键):有多个重复键的数据时获取多个,返回到一个列表中
(20)request.data:接收所有请求参数,是请求体的原始数据
(21)request.get_data():获取请求中的数据,默认读取为字节字符串(bytestring),将as_text参数设置为True则返回值将是unicode字符串
(22)request.files:获取请求的文件类型的数据
A、获取一个Werkzeug的MultiDict对象,包含所有上传文件,可以使用字典的形式获取文件
B、使用的键为文件input标签中的name属性值,对应的值为Werkzeug的FileStorage对象
C、可以调用save()方法并传入保存路径来保存文件
(23)request.form:获取post请求数据的方法,获取一个Werkzeug的ImmutableMultiDict对象,包含解析后的表单数据,表单字段值通过input标签的name属性值作为键获取
(24)request.values:获取一个Werkzeug的CombinedMultiDict对象,结合了args和form属性值
(25)request.is_json:通过MIME类型判断是否为JSON数据,返回布尔类型的值
(26)request.get_json():作为JSON解析并返回数据
A、如果MIME类似不是JSON,返回None(除非force设置为True)
B、解析出错抛出Werkzeug提供的BadRequest异常(如果未开启调试模式,则返回400错误码)
C、如果silent设置为True,则返回None,cache设置是否缓存解析后的JSON数据
(27)request.json:包含解析后的JSON数据,内部调用get_json(),通过字典的方式获取键值
2、post请求
(1)一种HTTP请求方法,POST用于向指定的资源提交要被处理的数据
(2)使用场景:不适合将数据放到URL参数中(密码),或者浏览器不支持太长长度的URL时
(3)测试方法:使用requests库模拟浏览器,requests.post方法模拟请求
(4)设置请求方式
A、页面调试报错method not allowed:视图函数没有允许post请求
B、@app.route路由器中添加methods参数,将允许支持的请求方式写入列表中(['GET','POST'])
(5)request.headers:获取post请求生成的HTTP请求头
(6)request.stream.read():获取post请求体的数据(post请求传递的数据)
(7)request.form:获取浏览器传递的数据(ImmutableMultiDict对象)
ImmutableMultiDict([('name', 'duxun'), ('hobby', '篮球'), ('hobby', '学习')])
(8)request.form.get(需求键)/request.form[需求键]方法
A、可以在字典参数中重大奥对应的数据键时,可以通过指定键获取到数据(类似字典取值)
B、无法在字典参数中找到对应的数据键时,request会返回内置的None,Flask服务器会报500错误
>>先判断得到的数据是否为None,再进行处理
>>通过request.form.get(需求键,默认值)的方式为其设置默认值,当无法获取到键时,直接使用默认值代替
(9)request.form.getlist(需求键):post请求数据存放于组合数据类型中有多个值时,返回到一个列表中
3、post表单请求
(1)前端form标签设置
A、利用HTML的表单和组件向服务器发起请求,需要对form标签设置参数
B、method:请求方式,设置成post
C、action:请求的地址,就是将数据提交到哪里,默认提交到当前路由(设置空)
D、enctype:用来表述请求数据不单单是字符
E、name:表单提交数据的参数,后端通过对应name值获取数据
(2)后post请求步骤
A、路由部分允许使用post请求:methods=["GET","POST"]
B、前端输入数据,发送请求
C、判断使用post请求:if request.method=="POST"
C、需要使用rquest.form,获取post请求传参
>> data = request.form.get("data")
D、视图函数+数据库,获得数据,返回到页面
E、进行模版渲染,展示数据
4、post的form操作
(1)前端form标签设置
A、利用HTML的表单和组件向服务器发起请求,需要对form标签设置参数
B、method:请求方式,设置成post
C、action:请求的地址,就是将数据提交到哪里,默认提交到当前路由(设置空)
D、enctype:用来表述请求数据不单单是字符(multipart/form-data)
E、name:表单提交数据的参数,后端通过对应name值获取数据
>> 前端需要注意在form标签上添加enctype属性
<form method="post" enctype="multipart/form-data">
<label>标题:<input type="text" name="title"></label>
<label>图片:<input type="file" name="picture"></label>
<label><button class="btn btn-primary">提交</button></label>
</form>
(2)后post请求步骤
A、路由部分允许使用post请求:methods=["GET","POST"]
B、前端输入数据,发送请求
C、判断使用post请求:if request.method=="POST"
C、需要使用rquest.files,获取file数据
>> data = request.files.get("img")
>> 获取文件名:filename = data.filename
D、将文件保存到服务器上:data.save("文件路径")
D、将文件在服务器上的路径,保存到数据库中
p.img = "文件路径"
p.save()
D、视图函数+数据库,返回到页面:{{ p.文件(数据库字段) }}
E、进行模版渲染,展示数据
(3)post请求用于向服务器提交数据
A、flask视图函数默认只接受get请求数据
B、post数据需要设置:methods = ["GET","POST"]
C、使用request.form接受post数据,使用get方法提取需求数据
D、post数据需要在form标签上设置method属性:method="post"
(4)图片处理步骤
A、get请求获取form表单
B、Form表单选中图片,进行上传 post 请求
C、视图接受到post请求的参数(图片)
D、视图保存数据:图片(静态资源)保存在服务器上面、数据库中保存图片的路径
"""
import os
from flask import Flask
from flask import request
from flask import render_template
basic = "F:/MyProject"
# 创建web服务器(http)实例:内置方法__name__是预定义变量,被设置为使用本模块,html存放的路径,静态文件的路径
app = Flask(__name__)
# 支持post请求:路由上添加methods方法(允许方式均可写入列表中)
@app.route('/demo/post', methods=['GET', 'POST'])
def post_demo():
# request.headers:获取post请求生成的HTTP请求头
print(request.headers)
# request.stream.read():获取post请求体的数据-->不要使用,否则后续form获取不到
# print(request.stream.read())
# 查看post请求向服务器传递的参数对象
print(request.form)
# 获取post请求的某个参数数据
print(request.form.get('name'))
# 获取post请求的某个参数数据
print(request.form['name'])
# post请求的字典参数中不存在时,进行判断处理
user = request.form.get('user')
if user is None:
print("参数数据user不存在~")
else:
print(f"参数数据user为:{user}")
# post请求的字典参数中不存在时,进行默认值设置
print(request.form.get('nick', '未知'))
# post请求的字典参数中存在组合类型的多个数据时
print(request.form.getlist('hobby'))
return '这是一个post请求'
# 结合数据库:设置允许请求方式:get、post
@app.route("/demo/database/",methods=["GET","POST"])
def get_test():
# 请求是post请求时,处理
if request.method == "POST":
# 接收表单数据:按照前端name属性获取值
name = request.form.get("name")
desc = request.form.get("desc")
# 调用Label表,保存数据
label = Label()
label.name = name
label.desc = desc
label.save()
return render_template("example.html",**locals())
# post请求-前端页面
'''
<form method="post" enctype="multipart/form-data">
<label>标签名称:<input type="text" name="name"></label>
<label>标签描述:<textarea name="desc"><textarea></label>
<label><input type="submit" value="提交"></label>
</form>
'''
# 启动项目服务器--可以通过参数更改,通常网站的页面需要放到网站服务器上,用户无法双击打开
if __name__ == '__main__':
def run(self):
app.run(
# host:主机地址
host="localhost",
# port:访问端口
port=80,
# debug:调试模式,测试环境True,生产环境Fasle
debug=True,
# use_reloader:自动重启
use_reloader=True
)
python flask接收 post json
转载本文章为转载内容,我们尊重原作者对文章享有的著作权。如有内容错误或侵权问题,欢迎原作者联系我们进行内容更正或删除文章。
提问和评论都可以,用心的回复会被更多人看到
评论
发布评论
相关文章
-
安装配置python后端Flask环境
安装配置python后端Flask环境
flask python 环境变量 后端