Flask_获取请求信息(三)
引用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
Flask_获取请求信息(三)的更多相关文章
- Asp.Net Core获取请求信息/获取请求地址
一.Asp.Net Core 2.0版本中目前HttpRequest是个抽象类 在控制器或视图上下文中获取到的 Request对象,是 DefaultHttpRequest的实例. 定义 如图 : ...
- thinkphp5.0 获取请求信息
如果要获取当前的请求信息,可以使用\think\Request类,除了下文中的 $request = Request::instance(); 也可以使用助手函数 $request = request ...
- 在dwr的调用类里获取请求信息
在dwr的调用类里获取请求的相关信息HttpSession session = WebContextFactory.get().getSession();HttpServletResponse res ...
- 常用Request对象获取请求信息
Request.ServerVariables(“REMOTE_ADDR”) ‘获取访问IPRequest.ServerVariables(“LOCAL_ADDR”) ‘同上Request.Serve ...
- Python+selenium之获取请求信息
basicConfig()所捕获的log信息.不过其开启的debug模式只能捕获到客户端像服务器发送的post()请求,而无法获取服务器所返回的应答信息. from random import ran ...
- jmeter获取请求信息和响应信息
String tmp = prev.getUrlAsString(); String tmp = prev.getRequestHeaders(); String tmp = prev.getResp ...
- 服务网关ZuulFilter过滤器--pre/post/error的用法(校验请求信息,获取路由后的请求/响应信息,处理服务网关异常)
微服务中Zuul服务网关一共定义了四种类型的过滤器: pre:在请求被路由(转发)之前调用 route:在路由(请求)转发时被调用 error:服务网关发生异常时被调用 post:在路由(转发)请求后 ...
- [Python自学] day-21 (1) (请求信息、html模板继承与导入、自定义模板函数、自定义分页)
一.路由映射的参数 1.映射的一般使用 在app/urls.py中,我们定义URL与视图函数之间的映射: from django.contrib import admin from django.ur ...
- ASP.NET获取请求的url信息汇总
ASP.NET获取请求的url信息汇总 最近做项目需要处理一个用代码获取当前网站的域名或ip信息的问题,于是尝试了ASP.NET中各种获取url信息的方法,在此总结一下: 在Global.asax文件 ...
随机推荐
- Project Reactor工厂方法和错误处理
工厂方法创建流 Backpressure : the ability for the consumer to signal the producer that the rate of emission ...
- Spring Batch Event Listeners
Learn to create and configure Spring batch's JobExecutionListener (before and after job), StepExecut ...
- Druid数据库连接池工具类
package cn.itcast.utils;import com.alibaba.druid.pool.DruidDataSourceFactory;import javax.sql.DataSo ...
- [笔记] Informer: Beyond Efficient Transformer for Long Sequence Time-Series Forecasting
原文地址:https://arxiv.org/abs/2012.07436 源码地址:https://github.com/zhouhaoyi/Informer2020
- HBuilderX无法启动微信小程序?仅三步
1.复制微信开发者工具启动路径 : "C:\Program Files (x86)\Tencent\微信web开发者工具\微信web开发者工具.exe" 不要后面的 "微 ...
- RocketMQ源码详解 | Broker篇 · 其五:高可用之主从架构
概述 对于一个消息中间件来讲,高可用功能是极其重要的,RocketMQ 当然也具有其对应的高可用方案. 在 RocketMQ 中,有主从架构和 Dledger 两种高可用方案: 第一种通过主 Brok ...
- ciscn_2019_s_9
很简单的一道题 例行检查 没有开启nx保护,就想到了shellcode来做 很明显的栈溢出 唯一的要求就是shellcode长度不能超过0x24 通过jump跳转到shellcode的位置 完整exp ...
- CF1106A Lunar New Year and Cross Counting 题解
Content 试求出在一个 \(n\times n\) 的地图 \(M\) 中,满足 \(1\leqslant i,j\leqslant n\) 且 \(M_{i,j}=M_{i+1,j+1}=M_ ...
- CF1547A Shortest Path with Obstacle 题解
Content 给定两个在二维平面上的网格 \(A(x_A,y_A)\) 和 \(B(x_B,y_B)\),另外,还有一个不可通过的网格 \(F(x_F,y_F)\).你需要求出在不经过 \(F\) ...
- python进程管理工具Supervisor
一.Supervisor简单介绍 supervisor是一个 Client/Server模式的系统,允许用户在类unix操作系统上监视和控制多个进程,或者可以说是多个程序.supervisor与lau ...