1、请求方法
1)、request.method
描述:获取当前请求的 HTTP 方法。
用法示例:
@app.route('/login', methods=['GET', 'POST']) def login(): if request.method == 'GET': # 处理 GET 请求 pass elif request.method == 'POST': # 处理 POST 请求 pass
2)、request.args
描述:获取 GET 请求中的查询参数。
用法示例:
@app.route('/search') def search(): keyword = request.args.get('keyword') # 处理查询参数 pass
3)、request.form
描述:获取 POST 请求中的表单数据。
用法示例:
@app.route('/login', methods=['POST']) def login(): username = request.form.get('username') password = request.form.get('password') # 处理表单数据 pass
4)、request.files
描述:获取请求中上传的文件。
用法示例:
@app.route('/upload', methods=['POST']) def upload(): file = request.files.get('file') if file: # 处理上传的文件 pass
5)、request.cookies
描述:获取请求中的 Cookies。
用法示例:
@app.route('/') def index(): username = request.cookies.get('username') # 处理 Cookies pass
2、响应方法
1)、return ‘text’
描述:返回纯文本响应。
用法示例:
@app.route('/') def index(): return 'Hello, World!'
2)、return render_template(‘template.html’, context)
描述:使用模板引擎渲染 HTML 模板,并返回响应。
用法示例:
@app.route('/user/<username>') def user(username): return render_template('user.html', username=username)
3)、return jsonify(data)
描述:返回 JSON 响应。
用法示例:
@app.route('/api/data') def api_data(): data = {'name': 'John', 'age': 30} return jsonify(data)
4)、return redirect(‘url’)
描述:重定向到指定的 URL。
用法示例:
@app.route('/redirect') def redirect_example(): return redirect('/new-url')
5)、return make_response(‘text’, status_code)
描述:构造自定义的响应对象。
用法示例:
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 请求和响应方法的原理分析
请求的原理
- 当用户发送 HTTP 请求到 Flask 应用时,Flask 会根据请求的 URL 和请求方法(GET、POST 等)匹配到相应的路由。
- 一旦匹配到路由,Flask 将创建一个 Request 对象,该对象封装了与请求相关的信息,如请求的 URL、请求方法、请求头、请求体等。
- Request 对象经过一系列处理流程,包括路由处理函数、请求钩子、中间件等,最终被传递给路由处理函数进行处理。
- 路由处理函数根据业务逻辑处理请求,并生成相应的数据。
- Flask 将生成的数据封装成一个 Response 对象。
响应的原理
- 在路由处理函数中,可以通过返回字符串、模板渲染、JSON 数据等方式生成响应数据。
- Flask 将生成的响应数据封装成一个 Response 对象,该对象包含了响应的内容、状态码、头部信息等。
- 在返回 Response 对象之前,Flask 可以通过请求钩子、中间件等机制对响应进行处理和修改。
- 最终,Flask 将 Response 对象发送给客户端,完成响应过程。
Flask 请求和响应方法的工作流程
- 客户端发送 HTTP 请求到 Flask 应用。
- Flask 应用根据请求的 URL 和方法匹配到相应的路由。
- Flask 创建一个 Request 对象,封装请求的信息。
- Request 对象经过处理流程,传递给路由处理函数进行处理。
- 路由处理函数根据业务逻辑生成响应数据。
- 响应数据被封装成 Response 对象。
- 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 的源码调用了几个关键的方法:
- app.preprocess_request():该方法在请求处理之前被调用,用于预处理请求,包括设置 request 对象和执行请求钩子函
- app.full_dispatch_request():该方法执行完整的请求分发过程,包括路由匹配、调用路由处理函数以及异常处理等
- app.make_response(response):该方法将路由处理函数返回的数据封装成一个 Response 对象。
- app.process_response(response):该方法在响应发送之前对响应进行处理,包括执行响应钩子函数等。
最后,我们通过 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()