详细简单介绍一下 Flask 的请求和响应方法,以及常用的方法与技巧。
描述:获取当前请求的 HTTP 方法。
用法示例:
@app.route('/login', methods=['GET', 'POST'])
def login():
if request.method == 'GET':
# 处理 GET 请求
pass
elif request.method == 'POST':
# 处理 POST 请求
pass
描述:获取 GET 请求中的查询参数。
用法示例:
@app.route('/search')
def search():
keyword = request.args.get('keyword')
# 处理查询参数
pass
描述:获取 POST 请求中的表单数据。
用法示例:
@app.route('/login', methods=['POST'])
def login():
username = request.form.get('username')
password = request.form.get('password')
# 处理表单数据
pass
描述:获取请求中上传的文件。
用法示例:
@app.route('/upload', methods=['POST'])
def upload():
file = request.files.get('file')
if file:
# 处理上传的文件
pass
描述:获取请求中的 Cookies。
用法示例:
@app.route('/')
def index():
username = request.cookies.get('username')
# 处理 Cookies
pass
描述:返回纯文本响应。
用法示例:
@app.route('/')
def index():
return 'Hello, World!'
描述:使用模板引擎渲染 HTML 模板,并返回响应。
用法示例:
@app.route('/user/' )
def user(username):
return render_template('user.html', username=username)
描述:返回 JSON 响应。
用法示例:
@app.route('/api/data')
def api_data():
data = {'name': 'John', 'age': 30}
return jsonify(data)
描述:重定向到指定的 URL。
用法示例:
@app.route('/redirect')
def redirect_example():
return redirect('/new-url')
描述:构造自定义的响应对象。
用法示例:
from flask import Flask, make_response
app = Flask(__name__)
@app.route('/custom_response')
def custom_response():
response_content = 'This is a custom response.'
status_code = 200 # HTTP 状态码
response = make_response(response_content, status_code)
return response
以下是使用一段简单的代码示例来跟踪 Flask 的源码并分析请求和响应的工作原理:
from flask import Flask
app = Flask(__name__)
@app.route('/')
def index():
return 'Hello, World!'
if __name__ == '__main__':
with app.test_request_context('/', method='GET'):
# 获取当前请求上下文
request = app.preprocess_request()
# 处理请求,执行路由匹配
response = app.full_dispatch_request()
# 处理响应
response = app.make_response(response)
response = app.process_response(response)
# 打印响应内容
print(response.get_data(as_text=True))
在这个示例中,我们创建了一个最简单的 Flask 应用,并定义了一个根路径的路由处理函数 index。然后,我们使用 test_request_context 创建一个虚拟的请求上下文,并手动模拟了一个 GET 请求。
在模拟请求过程中,我们按照 Flask 的源码调用了几个关键的方法:
最后,我们通过 response.get_data(as_text=True) 获取响应的内容,并打印在控制台上。
from flask import Flask, request, render_template, jsonify, redirect, make_response
app = Flask(__name__)
@app.route('/')
def index():
return 'Hello, World!'
@app.route('/login', methods=['GET', 'POST'])
def login():
if request.method == 'GET':
return render_template('login.html')
elif request.method == 'POST':
username = request.form.get('username')
password = request.form.get('password')
# 处理登录逻辑
if username == 'admin' and password == '123456':
response = make_response(redirect('/dashboard'))
response.set_cookie('username', username)
return response
else:
return 'Invalid username or password'
@app.route('/dashboard')
def dashboard():
username = request.cookies.get('username')
if username:
return f'Welcome, {username}!'
else:
return redirect('/login')
@app.route('/api/data')
def api_data():
data = {'name': 'John', 'age': 30}
return jsonify(data)
@app.errorhandler(404)
def page_not_found(error):
return render_template('404.html'), 404
@app.before_request
def before_request():
# 在请求处理之前执行的操作
pass
@app.after_request
def after_request(response):
# 在请求处理之后执行的操作
return response
if __name__ == '__main__':
app.run()