上海网站建设500元黑马it培训班出来现状
Request、Response、Cookies、Session等对象的使用
- Request对象
- 基本使用
- 参数的获取
- 转换器
- 内置转换器
- 自定义转换器
- Response对象
- 基本使用
- 返回模板
- 重定向
- 返回JSON
- Cookies对象
- 设置cookie
- 获取cookie
- 删除cookie
- Session会话对象
- 设置SECRET_KEY
- 设置会话
- 获取会话
- 释放会话
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, requestapp = 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.formprint(result)return "post"@app.route('/get')
def get():# 获取URL参数中名为name的值,默认为Jackname = 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 Flaskapp = 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', 500return '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 = 22return render_template('index.html', name=name, age=age)
重定向
在 Flask 中,可以使用 redirect 函数进行重定向。该函数位于 flask 模块中,可以接受一个 URL 参数作为重定向的目标。调用时,它返回一个响应对象,并将用户重定向到具有指定状态代码的另一个目标位置
当用户访问根URL/
时,会调用index
函数,并在其中调用 redirect
函数,将用户重定向到login
视图函数所对应的 URL。
from flask import Flask, redirect, url_forapp = 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'