引用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_获取请求信息(三)的更多相关文章

  1. Asp.Net Core获取请求信息/获取请求地址

     一.Asp.Net Core 2.0版本中目前HttpRequest是个抽象类 在控制器或视图上下文中获取到的 Request对象,是 DefaultHttpRequest的实例. 定义 如图 : ...

  2. thinkphp5.0 获取请求信息

    如果要获取当前的请求信息,可以使用\think\Request类,除了下文中的 $request = Request::instance(); 也可以使用助手函数 $request = request ...

  3. 在dwr的调用类里获取请求信息

    在dwr的调用类里获取请求的相关信息HttpSession session = WebContextFactory.get().getSession();HttpServletResponse res ...

  4. 常用Request对象获取请求信息

    Request.ServerVariables(“REMOTE_ADDR”) ‘获取访问IPRequest.ServerVariables(“LOCAL_ADDR”) ‘同上Request.Serve ...

  5. Python+selenium之获取请求信息

    basicConfig()所捕获的log信息.不过其开启的debug模式只能捕获到客户端像服务器发送的post()请求,而无法获取服务器所返回的应答信息. from random import ran ...

  6. jmeter获取请求信息和响应信息

    String tmp = prev.getUrlAsString(); String tmp = prev.getRequestHeaders(); String tmp = prev.getResp ...

  7. 服务网关ZuulFilter过滤器--pre/post/error的用法(校验请求信息,获取路由后的请求/响应信息,处理服务网关异常)

    微服务中Zuul服务网关一共定义了四种类型的过滤器: pre:在请求被路由(转发)之前调用 route:在路由(请求)转发时被调用 error:服务网关发生异常时被调用 post:在路由(转发)请求后 ...

  8. [Python自学] day-21 (1) (请求信息、html模板继承与导入、自定义模板函数、自定义分页)

    一.路由映射的参数 1.映射的一般使用 在app/urls.py中,我们定义URL与视图函数之间的映射: from django.contrib import admin from django.ur ...

  9. ASP.NET获取请求的url信息汇总

    ASP.NET获取请求的url信息汇总 最近做项目需要处理一个用代码获取当前网站的域名或ip信息的问题,于是尝试了ASP.NET中各种获取url信息的方法,在此总结一下: 在Global.asax文件 ...

随机推荐

  1. Project Reactor工厂方法和错误处理

    工厂方法创建流 Backpressure : the ability for the consumer to signal the producer that the rate of emission ...

  2. Spring Batch Event Listeners

    Learn to create and configure Spring batch's JobExecutionListener (before and after job), StepExecut ...

  3. Druid数据库连接池工具类

    package cn.itcast.utils;import com.alibaba.druid.pool.DruidDataSourceFactory;import javax.sql.DataSo ...

  4. [笔记] Informer: Beyond Efficient Transformer for Long Sequence Time-Series Forecasting

    原文地址:https://arxiv.org/abs/2012.07436 源码地址:https://github.com/zhouhaoyi/Informer2020

  5. HBuilderX无法启动微信小程序?仅三步

    1.复制微信开发者工具启动路径 : "C:\Program Files (x86)\Tencent\微信web开发者工具\微信web开发者工具.exe" 不要后面的 "微 ...

  6. RocketMQ源码详解 | Broker篇 · 其五:高可用之主从架构

    概述 对于一个消息中间件来讲,高可用功能是极其重要的,RocketMQ 当然也具有其对应的高可用方案. 在 RocketMQ 中,有主从架构和 Dledger 两种高可用方案: 第一种通过主 Brok ...

  7. ciscn_2019_s_9

    很简单的一道题 例行检查 没有开启nx保护,就想到了shellcode来做 很明显的栈溢出 唯一的要求就是shellcode长度不能超过0x24 通过jump跳转到shellcode的位置 完整exp ...

  8. 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_ ...

  9. CF1547A Shortest Path with Obstacle 题解

    Content 给定两个在二维平面上的网格 \(A(x_A,y_A)\) 和 \(B(x_B,y_B)\),另外,还有一个不可通过的网格 \(F(x_F,y_F)\).你需要求出在不经过 \(F\) ...

  10. python进程管理工具Supervisor

    一.Supervisor简单介绍 supervisor是一个 Client/Server模式的系统,允许用户在类unix操作系统上监视和控制多个进程,或者可以说是多个程序.supervisor与lau ...