引用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. java实现文件压缩

    java实现文件压缩:主要是流与流之间的传递 代码如下: package com.cst.klocwork.service.zip; import java.io.File; import java. ...

  2. bjdctf_2020_babystack2

    此题考整型的有符号无符号的东西... 下载文件还是,先检查一下保护. 64位程序,只开启了堆栈不可执行,看一下ida的伪代码. 大概流程就是先让你输入一个数,这个数就是后面read的可以输入的长度,要 ...

  3. [BUUCTF]REVERSE——刮开有奖

    刮开有奖 附件 步骤: 例行检查,无壳,32位程序 32位ida载入,shift+f12检索程序里的字符串,看到了一个base64加密的特征字符串,猜想这题用到了base64加密 从main函数开始看 ...

  4. LuoguB2045 晶晶赴约会 题解

    Content 贝贝邀请晶晶下个星期 \(x\)(如果 \(x=7\) 表示星期日)一起去看展览,但是晶晶下个星期 \(1,3,5\) 都有课.请你判断晶晶能否同意贝贝的请求. 数据范围:\(x\in ...

  5. RegExp正则表达式(三)–js中正则表达式的定义

    在js中,RegExp正则表达式的定义有两种方式:一种是普通方式,另一种是构造函数方式.无论是那种定义正则表达式的方式,它们都会返回RegExp对象. 普通方式定义正则表达式的格式 语法: var 变 ...

  6. java 多线程:线程死锁,如何判断程序是否有死锁代码块儿

    线程死锁 死锁是指两个或两个以上的线程在执行过程中,由于竞争资源或者由于彼此通信而造成的一种阻塞的现象,若无外力作用,它们都将无法推进下去(百度百科). 代码示例: /** * @ClassName ...

  7. Struts拦截器设置完的值为什么在页面取不到

    Struts拦截器设置完的值为什么在页面取不到. ActionContext ac = (ActionContext) invocation.getInvocationContext(); ac.pu ...

  8. Spring Boot中yml配置文件Map集合注入及使用方式

    yml配置文件 maps: "{key1: 'value1', key2: 'value2'}" java中 @Value("#{${maps}}") priv ...

  9. ubuntu用户、用户组设置命令总结

    1.ubuntu创建新用户: sudo adduser username(新建一个用户username) 2.设置用户 username 的密码(设置用户username密码) sudo passwd ...

  10. 【LeetCode】604. Design Compressed String Iterator 解题报告(C++)

    作者: 负雪明烛 id: fuxuemingzhu 个人博客:http://fuxuemingzhu.cn/ 目录 题目描述 题目大意 解题方法 维护当前字符和次数 日期 题目地址:https://l ...