Flask_获取请求信息(三)
2024-09-18 09:50:41
引用request的方法:
from flask import request
与Django不同的是,flask是不需要将request对象作为第一个参数传入视图函数,他的request
对象是来自于flask,是一个请求上下文
对象(全局变量 --> 线程局部变量,使用起来就像线程全局变量一样,具有较高的隔离性
),我们只需导入即可使用,request对象中保存了一次HTTP请求的一切信息。
request常用属性如下:
可以在 base_request.py 包的 BaseRequest 类中查看所有属性。
data属性
用于获取请求中的参数
# 获取请求中的参数
@app.route("/data/", methods=["POST"])
def request_data():
data = request.data
print(type(data)) # <class 'bytes'>
return F"{data}"
form属性
用于获取请求中的表单参数
# 获取请求的表单参数
@app.route("/form/", methods=["POST"])
def request_form():
form = request.form
print(type(form)) # <class 'werkzeug.datastructures.ImmutableMultiDict'>
print(form) # ImmutableMultiDict([('name', 'lisi'), ('age', '11')])
name = form.get("name")
age = form.get("age")
return F"{name},{age}"
args属性
用于获取请求中的URL中的参数
# 获取请求URL中的参数
@app.route("/args/")
def request_args():
args = request.args
print(type(args)) # <class 'werkzeug.datastructures.ImmutableMultiDict'>
print(args) # ImmutableMultiDict([('name', 'wangwu'), ('age', '12')])
name = args.get("name")
age = args.get("age")
return F"{name},{age}"
cookies属性
用于获取请求中的cookies参数
# 获取请求中的cookies信息
@app.route("/cookies/")
def request_cookies():
cookies = request.cookies
print(type(cookies)) # <class 'werkzeug.datastructures.ImmutableMultiDict'>
print(cookies) # ImmutableMultiDict([('cookie_name', 'zhaoliu')])
cookie_name = cookies.get("cookie_name")
return F"cookies:{cookie_name}"
headers属性
用于获取请求中的头部信息
# 获取请求中的headers信息
@app.route("/headers/")
def request_headers():
headers = request.headers
print(type(headers)) # <class 'werkzeug.datastructures.EnvironHeaders'>
print(headers)
"""
Headers-Name: luqi # 自定义的头部
Cache-Control: no-cache
Postman-Token: bb38af34-f18a-40f0-b974-a0af8d6e1389
User-Agent: PostmanRuntime/7.6.1
Accept: */*
Host: 127.0.0.1:5000
Cookie: cookie_name=zhaoliu
Accept-Encoding: gzip, deflate
Connection: keep-alive
"""
headers_name = headers.get("Headers-Name")
return F"{headers_name}"
method属性
用于获取请求的方式
# 获取请求的请求方式
@app.route("/method/")
def request_method():
method = request.method
print(type(method)) # <class 'str'>
print(method) # GET
return method
url属性
用于获取请求的链接
# 获取请求中的url信息
@app.route("/url/")
def request_url():
url = request.url
print(type(url)) # <class 'str'>
print(url) # http://127.0.0.1:5000/url/
return url
files属性
from werkzeug.utils import secure_filename # 文件上传
# 限制文件大小为16M,如果超过16M,Flask 会抛出一个 RequestEntityTooLarge 异常
app.config['MAX_CONTENT_LENGTH'] = 16 * 1024 * 1024
@app.route("/files/", methods=["POST"])
def request_files():
files = request.files
print(type(files)) # <class 'werkzeug.datastructures.ImmutableMultiDict'>
print(files) # ImmutableMultiDict([('filename', <FileStorage: '1.jpg' ('image/jpeg')>)])
# 获取文件对象
file = files.get("file") # <FileStorage: '1.jpg' ('image/jpeg')>
if file is None:
return "未上传文件"
# 获取文件的名字
filename = file.filename # 1.jpg
# 解决文件名伪造问题
filename = secure_filename(filename) # 将文件保存到本地
# 1、使用python的open方法
# with open("./" + filename, "wb") as f:
# # 读取上传的文件
# file_content = file.read()
# # 写入到本地文件
# f.write(file_content) # 2、使用flask封装的save方法
file.save("./" + filename)
return "上传成功"
上面代码中,我们使用 Werkzeug
提供的 secure_filename()
函数来解决文件名伪造的问题:
filename = secure_filename(filename)
试想一下,如果我们不这样处理,假如有人恶意仿造文件名,把下面的信息作为 filename 传递给你的应用:
filename = "../../../../home/username/.bashrc"
假设 ../
的个数是正确的,那么用户就有可能修改服务器上的文件。
通过交互模式,我们看看 secure_filename() 函数的处理机制:
附码:
from flask import Flask, request
from werkzeug.utils import secure_filename app = Flask(__name__) # 获取请求的参数
@app.route("/data/", methods=["POST"])
def request_data():
data = request.data
print(type(data)) # <class 'bytes'>
return F"{data}" # 获取请求的表单参数
@app.route("/form/", methods=["POST"])
def request_form():
form = request.form
print(type(form)) # <class 'werkzeug.datastructures.ImmutableMultiDict'>
print(form) # ImmutableMultiDict([('name', 'lisi'), ('age', '11')])
name = form.get("name")
age = form.get("age")
return F"{name},{age}" # 获取请求URL中的参数
@app.route("/args/")
def request_args():
args = request.args
print(type(args)) # <class 'werkzeug.datastructures.ImmutableMultiDict'>
print(args) # ImmutableMultiDict([('name', 'wangwu'), ('age', '12')])
name = args.get("name")
age = args.get("age")
return F"{name},{age}" # 获取请求中的cookies信息
@app.route("/cookies/")
def request_cookies():
cookies = request.cookies
print(type(cookies)) # <class 'werkzeug.datastructures.ImmutableMultiDict'>
print(cookies) # ImmutableMultiDict([('cookie_name', 'zhaoliu')])
cookie_name = cookies.get("cookie_name")
return F"cookies:{cookie_name}" # 获取请求中的headers信息
@app.route("/headers/")
def request_headers():
headers = request.headers
print(type(headers)) # <class 'werkzeug.datastructures.EnvironHeaders'>
print(headers)
"""
Headers-Name: luqi # 自定义的头部
Cache-Control: no-cache
Postman-Token: bb38af34-f18a-40f0-b974-a0af8d6e1389
User-Agent: PostmanRuntime/7.6.1
Accept: */*
Host: 127.0.0.1:5000
Cookie: cookie_name=zhaoliu
Accept-Encoding: gzip, deflate
Connection: keep-alive
"""
headers_name = headers.get("Headers-Name")
return F"{headers_name}" # 获取请求的请求方式
@app.route("/method/")
def request_method():
method = request.method
print(type(method)) # <class 'str'>
print(method) # GET
return method # 获取请求中的url信息
@app.route("/url/")
def request_url():
url = request.url
print(type(url)) # <class 'str'>
print(url) # http://127.0.0.1:5000/url/
return url # 文件上传
# 限制文件大小为16M,如果超过16M,Flask 会抛出一个 RequestEntityTooLarge 异常
app.config['MAX_CONTENT_LENGTH'] = 16 * 1024 * 1024
@app.route("/files/", methods=["POST"])
def request_files():
files = request.files
print(type(files)) # <class 'werkzeug.datastructures.ImmutableMultiDict'>
print(files) # ImmutableMultiDict([('filename', <FileStorage: '1.jpg' ('image/jpeg')>)])
# 获取文件对象
file = files.get("file") # <FileStorage: '1.jpg' ('image/jpeg')>
if file is None:
return "未上传文件"
# 获取文件的名字
filename = file.filename # 1.jpg
# 解决文件名伪造问题
filename = secure_filename(filename) # 将文件保存到本地
# 1、使用python的open方法
# with open("./" + filename, "wb") as f:
# # 读取上传的文件
# file_content = file.read()
# # 写入到本地文件
# f.write(file_content) # 2、使用flask封装的save方法
file.save("./" + filename)
return "上传成功" if __name__ == '__main__':
app.run()
原文参考: https://blog.csdn.net/qq_42517220/article/details/88710861
BaseRequest
最新文章
- 【干货】JS版汉字与拼音互转终极方案,附简单的JS拼音输入法
- 《Effective C#》读书笔记
- swift tableview的分割线不能到头
- 【转】JSP中的相对路径和绝对路径
- SQL SERVER 导出到Oracle 问题与技巧
- Win7+xp命令行 一键修改IP、DNS
- Codeforces Round #277 (Div. 2) A. Calculating Function 水题
- AI 对不起 我还爱着你
- C# 两时间,时间间隔
- linux ERROR: ld.so: object '/lib/libcwait.so' from /etc/ld.so.preload cannot be preloaded: ignored.
- IO流文件字符输入输出流,缓冲流
- bzoj1145
- java 获取特定天数的时间戳
- C++汉字转拼音(转)
- SpringMVC的@ModelAttribute注解简单使用(用户修改信息)
- iOS横向瀑布流的封装
- 入门-什么是webshell?
- 最短路算法之Dijkstra算法通俗解释
- python web开发-flask读取txt文件内容
- Win10安装和配置JDK
热门文章
- 10.Object类
- 【JavaWeb】【JSP】【Bean】JavaBean基础使用方法与操作步骤
- Nginx HTTP块配置
- vue-cli4结合element-ui异常解决(前端小白,文摘取自网络)
- Spring Cloud Eureka源码分析之三级缓存的设计原理及源码分析
- [BUUCTF]PWN——0ctf_2017_babyheap
- android studio出现 Could not initialize class com.android.sdklib.repository.AndroidSdkHandler
- uni-app + Cloudbase——uni-app 项目中如何使用腾讯云开发后端服务
- 惊天大bug,一把螺丝刀,竟让我有家难回!
- java IO操作和计算操作:工作内存和主内存 volatile关键字作用;原子操作对象AtomicInteger ....