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文件 ...
随机推荐
- 【Java】【设计模式】单例设计模式
思想: 为了避免其他程序过多建立该类对象,先禁止其他程序建立该类对象 为了让其他程序可以访问到该类对象,只好在本类中自定义一个对象 为了方便其他程序对自定义对象的访问,可以对外提供一些访问方式 代码体 ...
- 阿里云esc 安装 docker
1. 更新 yum 到最新: yum update (用 root 用户登录,无需加 sudo,如果不是,需要加,即 yum update ) 2. 安装软件包:yum-util(提供 yum-co ...
- JS中操作JSON总结
JSON(JavaScript Object Notation) 是一种轻量级的数据交换格式,采用完全独立于语言的文本格式,是理想的数据交换格式.同时,JSON是 JavaScript 原生格式,这意 ...
- 【C/C++】C++ warning: control reaches end of non-void function return
控制到达非void函数的结尾. 一些本应带有返回值的函内数到容达结尾后可能并没有返回任何值. 这时候,最好检查一下是否每个控制流都会有返回值. 我是ostream声明的时候没有写return out; ...
- aha
欢迎使用 MWeb MWeb 是专业的 Markdown 写作.记笔记.静态博客生成软件,目前已支持 Mac,iPad 和 iPhone.MWeb 有以下特色: 软件本身: 使用原生的 macOS 技 ...
- 【大咖直播】Elastic 企业搜索实战工作坊(第二期)
借助 App Search 提供的内置功能,您可轻松打造卓越的搜索体验.直观的相关度调整以及开箱即用的搜索分析,不仅可以优化所提供的内容,其提供的 API 还可帮助您将位于各处的所有内容源关联在一起. ...
- CF1082A Vasya and Book 题解
Content 给定 \(T\) 组数据,每组数据给出四个整数 \(n,x,y,d\).小 V 有一本 \(n\) 页的书,每次可以恰好翻 \(d\) 页,求从第 \(x\) 页恰好翻到第 \(y\) ...
- 创建Harbor私有仓库
前提 1.安装docker服务 参考:https://blog.csdn.net/weixin_36522099/article/details/108861134 老名字:docker.docker ...
- 贪心——55. 跳跃游戏 && 45.跳跃游戏II
给定一个非负整数数组,你最初位于数组的第一个位置. 数组中的每个元素代表你在该位置可以跳跃的最大长度. 判断你是否能够到达最后一个位置. 示例 1: 输入: [2,3,1,1,4] 输出: true ...
- 【LeetCode】1102. Path With Maximum Minimum Value 解题报告 (C++)
作者: 负雪明烛 id: fuxuemingzhu 个人博客:http://fuxuemingzhu.cn/ 目录 题目描述 题目大意 解题方法 排序+并查集 优先级队列 日期 题目地址:https: ...