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'

猜你喜欢

转载自blog.csdn.net/qq_38628046/article/details/129090168