在 Flask 中,视图函数可以返回多种类型的响应,例如字符串、HTML、JSON、文件等。Flask 提供了 make_response
函数,用于生成和自定义 HTTP 响应。
2.1 默认响应
默认情况下,视图函数返回的字符串会被 Flask 包装成一个 HTTP 响应,状态码为 200 OK
,内容类型为 text/html
。
@app.route('/') def home(): return "Hello, World!" # 默认状态码为 200,内容类型为 text/html
2.2 使用 make_response
自定义响应
make_response
函数允许你自定义响应的状态码、头部、内容类型等。
2.2.1 基本用法
from flask import Flask, make_response app = Flask(__name__) @app.route('/custom') def custom_response(): response = make_response("This is a custom response", 201) # 状态码为 201 response.headers['Content-Type'] = 'text/plain' return response
make_response
的第一个参数是响应内容,第二个参数是状态码。可以通过
response.headers
设置响应头部。
2.2.2 设置 Cookies
@app.route('/set-cookie') def set_cookie(): response = make_response("Cookie set!") response.set_cookie('username', 'john') return response
set_cookie
方法用于设置 Cookie。
2.2.3 返回 JSON 数据
python
复制
from flask import jsonify @app.route('/json') def json_response(): data = {'name': 'John', 'age': 30} return jsonify(data) # 返回 JSON 格式的响应
jsonify
函数会将 Python 字典转换为 JSON 格式的响应。
2.2.4 返回文件
from flask import send_file @app.route('/download') def download_file(): return send_file('path/to/file.txt', as_attachment=True)
send_file
函数用于发送文件,as_attachment=True
表示文件作为附件下载。
3. 请求和响应的完整示例
以下是一个完整的示例,展示如何处理请求和生成响应:
python
复制
from flask import Flask, request, make_response, jsonify app = Flask(__name__) @app.route('/greet', methods=['GET', 'POST']) def greet(): if request.method == 'GET': name = request.args.get('name', 'Guest') elif request.method == 'POST': name = request.form.get('name', 'Guest') response = make_response(f"Hello, {name}!", 200) response.set_cookie('username', name) return response @app.route('/api/data') def api_data(): data = {'status': 'success', 'message': 'Hello, World!'} return jsonify(data) if __name__ == '__main__': app.run(debug=True)
访问
/greet?name=John
会返回"Hello, John!"
,并设置一个名为username
的 Cookie。访问
/api/data
会返回 JSON 格式的响应。