Flask框架之Request、Response、Cookies、Session等对象的使用
Request对象
Flask Request对象是一个封装了HTTP请求信息的类,它提供了访问HTTP请求的各种属性和方法,如URL参数、表单数据、文件上传等。
可以通过request变量来访问该对象,在Flask应用中接收并处理来自客户端发送的HTTP请求。例如,可以使用
request.method
获取HTTP请求方法,使用request.args.get('key')
获取URL参数,使用request.form.get('key')
获取表单数据。
Request对象的重要属性:
属性 | 说明 |
---|---|
Form | 它是一个字典对象,包含表单参数及其值的键和值对 |
args | 解析查询字符串的内容,它是问号(?)之后的URL的一部分 |
Cookies | 保存Cookie名称和值的字典对象 |
files | 与上传文件有关的数据 |
method | 当前请求方法 |
基本使用
使用Flask Request对象需要在Flask应用程序中导入request模块。
from flask import Flask, request
app = Flask(__name__)
@app.route('/')
def student():
return render_template('index.html')
@app.route('/post',methods = ['POST', 'GET'])
def post():
if request.method == 'POST':
# request.form:表单数据
result = request.form
print(result)
return "post"
@app.route('/get')
def get():
# 获取URL参数中名为name的值,默认为Jack
name = request.args.get('name', 'Jack')
return f'Hello, {name}!'
@app.route('/upload', methods=['POST'])
def upload():
# 获取上传文件对象
file = request.files['file']
if file:
return 'File uploaded successfully.'
if __name__ == '__main__':
app.run()
参数的获取
在 Flask 中,可以通过request对象获取请求的参数。不同位置的参数都存放在request的不同属性中
属性 | 说明 | 类型 |
---|---|---|
data | 记录请求的数据,并转换为字符串 | * |
form | 记录请求中的表单数据 | MultiDict |
args | 记录请求中的查询参数 | MultiDict |
cookies | 记录请求中的cookie信息 | Dict |
headers | 记录请求中的报文头 | EnvironHeaders |
method | 记录请求使用的HTTP方法 | GET/POST |
url | 记录请求的URL地址 | string |
files | 记录请求上传的文件 | * |
1.获取 GET 请求参数
request.args.get('参数名')
2.获取 POST 请求参数
request.form.get('参数名')
request.values.get('参数名')
注意:前者只能获取表单数据,后者既可以获取表单数据,也可以获取 URL 查询字符串中的数据。
3.获取上传的文件
request.files['文件字段名']
注意:如果请求中不存在指定的参数或文件,上述方法会返回None
4.获取多个值相同的参数
这些方法会返回一个列表,其中包含所有同名参数的值。
request.args.getlist('参数名')
request.form.getlist('参数名')
request.values.getlist('参数名')
使用示例:
获取请求/user?uid=1
中uid参数
from flask import request
@app.route('/user')
def user():
uid = request.args.get('uid')
return 'USER ID: {}'.format(uid)
客户端上传图片到服务器,并保存到服务器中
@app.route('/upload', methods=['POST'])
def upload_file():
f = request.files['pic']
# with open('./upload.png', 'wb') as new_file:
# new_file.write(f.read())
f.save('./upload.png')
return 'upload successful'
转换器
Flask不同于Django直接在定义路由时编写正则表达式的方式,而是采用转换器。使用转换器实现匹配URL路径参数、动态路由,将URL中的变量转换为Python 对象,并将其传递给视图函数。
假设有一个请求访问接口地址为:/users/1
,其中1是具体请求参数
@app.route('/user/<uid>')
def user(uid):
print(type(uid))
return 'USER ID: {}'.format(uid)
<>即是一个转换器,默认为字符串类型,兼容数值,将该位置的数据以字符串格式进行匹配、并以字符串为数据类型、 uid为参数名传入视图。
内置转换器
Flask中的Flask内置了常见的转换器:
DEFAULT_CONVERTERS: t.Mapping[str, t.Type[BaseConverter]] = {
"default": UnicodeConverter,
"string": UnicodeConverter,
"any": AnyConverter,
"path": PathConverter,
"int": IntegerConverter,
"float": FloatConverter,
"uuid": UUIDConverter,
}
以整型匹配数据
@app.route('/user/<int:uid>')
def user(uid):
print(type(uid))
return 'USER ID: {}'.format(uid)
@app.route('/user/<int(min=5):uid>')
def user(uid):
print(type(uid))
return 'USER ID: {}'.format(uid)
自定义转换器
当Flask内置的转换器就无法满足需求时,Flask还允许自定义转换器来处理更加特殊的需求。自定义转换器需要继承自
werkzeug.routing.BaseConverter
类。
from flask import Flask
app = Flask(__name__)
from werkzeug.routing import BaseConverter
# 1.定义转换器类,继承⾃baseconverter
class EmailConverter(BaseConverter):
# 指定匹配时的正则表达式
regex = r'^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}$'
class UpperConverter(BaseConverter):
def to_upper(self, value):
return value.upper()
# 2.将自定义转换器添加到转换器字典中,并指定转换器使用时名字为: email
app.url_map.converters['email'] = EmailConverter
app.url_map.converters['upper'] = UpperConverter
# 3.在使用转换器的地方定义使用,即在装饰器中使⽤转换器
@app.route('/send_email/<email:to_email>')
def send_sms_code(to_email):
return 'send email to {}'.format(to_email)
@app.route('/<upper:name>')
def hello(name):
return f'Hello, {name}!'
Response对象
Flask中的Response对象是用于构建 HTTP 响应的类。它继承自 Python 标准库中的
werkzeug.wrappers.Response
类,提供了一些方便的方法,如设置响应头、状态码和内容等。
在 Flask 应用程序中,通常使用
make_response()
函数来创建一个响应对象。这个函数会根据给定的参数创建一个 Response 对象,并返回该对象。
基本使用
调用 make_response() 函数来创建一个响应对象并将字符串Hello, World
设置为响应体。然后,设置响应头部信息 Token
,设置响应状态码200 OK
,并最终将响应对象返回给客户端。
from flask import make_response
@app.route('/')
def index():
resp = make_response('Hello World')
resp.headers["Token"] = "Python"
resp.status = "200 OK"
return resp
还可以通过元祖方式进行响应:
返回一个元组,元组必须是 (response, status, headers) 的形式,且至少包含一个元素。 status 值会覆盖状态代码, headers可以是一个列表或字典,作为额外的消息标头值。
@app.route('/')
def index():
# return 'Hello Wold', 500
return 'Hello Wold', 200, {'Token': 'Python'}
返回模板
在templates
目录新建一个模板index.html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<div>
<b>姓名:</b><span>{{ name }}</span>
<br>
<b>年龄:</b> <span>{{ age }}</span>
</div>
</body>
</html>
在后端视图,使用render_template方法渲染模板并返回
from flask import render_template
@app.route('/')
def index():
name = 'Flask'
age = 22
return render_template('index.html', name=name, age=age)
重定向
在 Flask 中,可以使用 redirect 函数进行重定向。该函数位于 flask 模块中,可以接受一个 URL 参数作为重定向的目标。调用时,它返回一个响应对象,并将用户重定向到具有指定状态代码的另一个目标位置
当用户访问根URL/
时,会调用index
函数,并在其中调用 redirect
函数,将用户重定向到login
视图函数所对应的 URL。
from flask import Flask, redirect, url_for
app = Flask(__name__)
@app.route('/')
def index():
return redirect(url_for('login'))
@app.route('/login')
def login():
return 'Login page'
当访问URL/test
时,会重定向到baidu.com
from flask import redirect
@app.route('/test')
def test():
return redirect('http://www.baidu.com')
注意:
在 redirect 函数中传入的 URL 参数可以是相对路径或绝对路径。如果传入的是相对路径,则会基于当前请求的 URL 进行解析,生成最终的重定向目标 URL。如果传入的是绝对路径,则直接使用该路径作为重定向目标 URL。
返回JSON
在 Flask 中,可以使用 jsonify 函数将 Python 对象转换为 JSON 格式,并返回一个包含 JSON 数据的响应对象。
from flask import jsonify
@app.route('/')
def index():
json_dict = {
"name": 'Flask',
"age": 22
}
return jsonify(json_dict)
注意:
在返回 JSON 数据之前,需要将Python对象转换为JSON格式。可以使用
json.dumps()
函数完成这个转换过程。但是,在 Flask 中,通常使用 jsonify() 函数来代替 json.dumps() 函数,因为 jsonify() 函数除了将对象转换为 JSON 格式外,还会设置正确的 MIME 类型,以及处理跨域访问等问题。
Cookies对象
Request对象包含Cookie对象属性,它是所有cookie变量及其对应值的字典对象
设置cookie
设置cookie,默认有效期是临时cookie,浏览器关闭就失效
@app.route('/set')
def set():
resp = make_response('Hello World')
resp.set_cookie('Token', 'Python' , max_age=3600)
return resp
在设置 cookie 时,可以指定其过期时间、域名、路径等信息。在 Flask 中,可以通过设置 max_age、expires、domain、path 等参数来实现这些功能。
resp.set_cookie('user', 'Tom', max_age=3600, expires=None, domain=None, path='/')
max_age :参数表示 cookie 的最大存活时间(单位为秒)
expires :参数表示 cookie 的过期时间(可以是一个 datetime 对象或时间戳)
domain :参数表示 cookie 可以被发送到哪些域名
path : 参数表示 cookie 在哪些路径下可用
获取cookie
获取cookie,通过request.cookies的方式, 返回的是一个字典,可以获取字典里的相应的值
@app.route('/get')
def get():
resp = request.cookies.get('Token')
return resp
删除cookie
删除只是让cookie过期,并不是直接删除cookie,通过delete_cookie()的方式
@app.route('/delete')
def delete():
response = make_response('Successfully')
response.delete_cookie('Token')
return response
Session会话对象
与Cookie不同,Session(会话)数据存储在服务器上。会话是客户端登录到服务器并注销服务器的时间间隔。需要在该会话中保存的数据会存储在服务器上的临时目录中
Session对象也是一个字典对象,包含会话变量和关联值的键值对。
设置SECRET_KEY
为每个客户端的会话分配会话ID。会话数据存储在cookie的顶部,服务器以加密方式对其进行签名。对于此加密,Flask应用程序需要一个定义的SECRET_KEY。
class DefaultConfig(object):
SECRET_KEY = '6512bd43d9caa6e02c990b0a82652dca'
app.config.from_object(DefaultConfig)
直接设置
app.secret_key='6512bd43d9caa6e02c990b0a82652dca'
设置会话
from flask import session
@app.route('/set')
def set():
session['Token'] = 'Python'
return 'Successfully'
获取会话
可以在 Flask 应用程序中的任何地方访问这个Session变量
@app.route('/get')
def get():
Token = session.get('Token')
return 'session : {}'.format(Token)
释放会话
@app.route('/pop')
def pop():
session.pop('Token', None)
return 'OK'
转载自:https://juejin.cn/post/7230806990452670501