Flask 请求与响应处理:深入了解 Request 和 Response
在现代 Web 开发中,Flask 是一个轻量级的 Web 框架,因其简单、灵活的特性而受到广泛的欢迎。理解 Flask 中的请求和响应对象是开发高效 Web 应用的基础。本文将深入探讨 Flask 中的请求(Request)和响应(Response)对象,学习如何获取请求数据、如何处理响应以及如何自定义响应头、状态码和 Cookies。
1. 请求对象 (Request)
在 Flask 中,每个 HTTP 请求都会由一个 Request
对象表示。这个对象包含了所有关于 HTTP 请求的信息,包括请求方法(GET, POST, PUT, DELETE 等)、URL、表单数据、文件上传内容等。
获取请求数据
Flask 提供了多种方式来获取请求中的数据,常见的有以下几种:
-
表单数据: 表单数据通常通过
POST
请求提交,可以通过request.form
访问。from flask import Flask, request app = Flask(__name__) @app.route('/login', methods=['POST']) def login(): username = request.form['username'] password = request.form['password'] return f'Username: {username}, Password: {password}'
在这个例子中,表单数据会被提取并返回给客户端。
-
JSON 数据: 如果客户端发送的是 JSON 格式的数据(例如通过
application/json
Content-Type),可以通过request.get_json()
方法获取数据。@app.route('/api/data', methods=['POST']) def api_data(): data = request.get_json() return f'Received data: {data}'
在这个例子中,Flask 会自动解析请求体中的 JSON 数据并将其转换为 Python 字典。
-
Params数据:如果客户端发送的是Params数据,(例如地址传参),可以通过
request.args.get('name')
@role_bp.route('/list', methods=['GET']) async def role_list(): query = request.args.get('name') return await role_service.get_role_list(query)
-
文件上传: 如果客户端上传文件(通常是通过
multipart/form-data
编码),可以通过request.files
获取文件对象。@app.route('/upload', methods=['POST']) def upload_file(): file = request.files['file'] file.save(f'./uploads/{file.filename}') return 'File uploaded successfully'
这里,文件被保存到服务器的本地目录中。
请求头和其他信息
你还可以从 request
对象获取请求头信息,例如获取客户端发送的 User-Agent
或 Accept-Language
等。
@app.route('/user-agent', methods=['GET'])
def user_agent():
user_agent = request.headers.get('User-Agent')
return f'Your User-Agent is {user_agent}'
2. 响应对象 (Response)
Flask 中的 Response
对象代表了服务器向客户端返回的 HTTP 响应。一个 Flask 路由处理函数的默认返回值是一个字符串,Flask 会自动将其转换为 Response
对象。
设置响应内容
返回一个字符串时,Flask 会自动将其转换为响应体,但你也可以显式设置响应内容、响应头、状态码等。
from flask import Flask, Response
@app.route('/custom-response', methods=['GET'])
def custom_response():
return Response('Hello, Flask!', content_type='text/plain', status=200)
在这个例子中,我们创建了一个自定义的 Response
,并设置了响应体、内容类型和状态码。
设置响应头
你可以通过 Response
对象设置响应头,或者使用 make_response()
方法来手动构造响应。
from flask import make_response
@app.route('/custom-header', methods=['GET'])
def custom_header():
response = make_response('Custom header set')
response.headers['X-Custom-Header'] = 'Hello'
return response
此示例会在响应头中添加一个名为 X-Custom-Header
的自定义字段。
设置状态码
Flask 会根据路由处理函数的返回值自动设置状态码。如果你需要自定义状态码,可以显式设置。
@app.route('/created', methods=['POST'])
def created():
return 'Resource created successfully', 201
在这个例子中,状态码 201 表示资源已成功创建。
设置 Cookie
Flask 允许你轻松地设置和读取 Cookies。通过 response.set_cookie()
方法,你可以在响应中设置 Cookies。
@app.route('/set-cookie', methods=['GET'])
def set_cookie():
response = make_response('Cookie has been set!')
response.set_cookie('username', 'flask_user')
return response
在这个例子中,Flask 会设置一个名为 username
的 Cookie。
3. 请求和响应的常见组合
在一个完整的 Web 应用中,请求和响应通常是配合使用的。例如,在表单提交后,接收并处理数据后返回一个响应:
@app.route('/submit', methods=['POST'])
def submit():
username = request.form['username']
password = request.form['password']
response = make_response(f'Welcome, {username}!')
response.set_cookie('username', username)
return response
在这个例子中,用户提交表单后,服务器会提取表单数据,设置 Cookie 并返回响应。
Flask 中的请求和响应处理是 Web 开发中至关重要的部分。通过 Request
对象,我们可以获取来自客户端的各种请求数据(如表单、JSON、文件上传等),而通过 Response
对象,我们可以灵活地设置响应内容、状态码、响应头和 Cookies。
掌握 Flask 请求和响应的基本操作将为你开发出更复杂和灵活的 Web 应用打下坚实的基础
更多请关注公众号 “学GIS的小宝同学”