Flask 视图函数 - FLASK教程

Flask 视图函数

视图函数是 Flask 应用中的核心部分,它负责处理请求并生成响应。

视图函数与路由紧密结合,通过路由将 URL 映射到具体的视图函数。

以下是对 Flask 视图函数的详细说明,包括如何定义、使用请求数据、返回响应、以及如何处理错误等。

  1. 定义视图函数 :视图函数是处理请求并返回响应的核心功能。
  2. 接收请求数据 :使用 request 对象获取 URL 参数、表单数据、查询参数等。
  3. 返回响应 :可以返回字符串、HTML、JSON 或自定义响应对象。
  4. 处理请求和响应 :使用 request 对象和 make_response 来处理请求和生成自定义响应。
  5. 处理错误 :视图函数内处理异常或使用 Flask 的错误处理机制。
  6. 视图函数的装饰器 :使用 @app.before_request @app.after_request 等装饰器处理请求前后逻辑。
  7. 视图函数返回的状态码 :可以指定 HTTP 状态码来表示请求的处理结果。

1. 定义视图函数

视图函数是一个普通的 Python 函数,它接收请求并返回响应。视图函数通常与路由配合使用,通过装饰器将 URL 映射到视图函数。

示例代码
fromflaskimportFlaskapp=Flask(__name__)@app.route('/')defhome():return'Hello, World!'

  • @app.route('/') :将根 URL / 映射到 home 视图函数。
  • def home() :视图函数,返回字符串 'Hello, World!' 作为响应。

2. 接收请求数据

视图函数可以接收不同类型的请求数据,包括 URL 参数、表单数据、查询参数等。

获取 URL 参数:

示例代码
@app.route('/greet/<name>')defgreet(name):returnf'Hello, {name}!'
  • <name> 是一个 URL 参数,传递到视图函数 greet

获取表单数据:

示例代码
[email protected]('/submit',methods=['POST'])defsubmit():username=request.form.get('username')returnf'Form submitted by {username}!'

request.form.get('username') :获取 POST 请求中表单数据的 username 字段。

获取查询参数:

示例代码
@app.route('/search')defsearch():query=request.args.get('query')returnf'Search results for: {query}'

request.args.get('query') :获取 GET 请求中的查询参数 query。

3. 返回响应

视图函数可以返回多种类型的响应,包括字符串、HTML、JSON、或自定义响应对象。

返回字符串:

示例代码
@app.route('/message')defmessage():return'This is a simple message.'

返回 HTML 模板:

示例代码
[email protected]('/hello/<name>')defhello(name):returnrender_template('hello.html',name=name)

render_template('hello.html', name=name) :渲染 HTML 模板 hello.html,并将 name 变量传递给模板。

返回 JSON 数据:

示例代码
[email protected]('/api/data')defapi_data():data={'key':'value'}returnjsonify(data)

jsonify(data) :将 Python 字典转换为 JSON 响应。

返回自定义响应对象:

示例代码
[email protected]('/custom')defcustom_response():response=Response('Custom response with headers',status=200)response.headers['X-Custom-Header']='Value'returnresponse

Response('Custom response with headers', status=200) :创建自定义响应对象,并设置响应头。

4. 处理请求和响应

视图函数可以访问请求对象,并根据请求数据生成响应。可以使用 request 对象来获取请求的信息,使用 make_response 来创建自定义响应。

使用 request 对象:

示例代码
[email protected]('/info')definfo():user_agent=request.headers.get('User-Agent')returnf'Your user agent is {user_agent}'

request.headers.get('User-Agent') :获取请求头中的 User-Agent 信息。

使用 make_response:

示例代码
[email protected]('/header')defcustom_header():response=make_response('Response with custom header')response.headers['X-Custom-Header']='Value'returnresponse

make_response('Response with custom header') :创建响应对象并设置自定义头信息。

5. 处理错误

可以在视图函数中处理异常或错误,或者通过 Flask 提供的错误处理机制来处理应用中的错误。

在视图函数中处理错误:

示例代码
@app.route('/divide/<int:x>/<int:y>')defdivide(x,y):try:result=x / yreturnf'Result: {result}'exceptZeroDivisionError:return'Error: Division by zero',400

使用 try-except 语句处理除零错误,并返回自定义错误消息和状态码。

全局错误处理:

示例代码
@app.errorhandler(404)defnot_found(error):return'Page not found',404

@app.errorhandler(404) :定义处理 404 错误的函数。

6. 视图函数的装饰器

除了 @app.route,Flask 还支持其他装饰器,用于实现更复杂的功能。

示例:

  • @app.before_request :在每个请求处理之前运行的函数。
  • @app.after_request :在每个请求处理之后运行的函数。
  • @app.teardown_request :在请求结束后运行的函数,用于清理工作。

示例装饰器使用:

示例代码
@app.before_requestdefbefore_request():print('Before request')@app.after_requestdefafter_request(response):print('After request')[email protected]_requestdefteardown_request(exception):print('Teardown request')

7. 视图函数返回的状态码

视图函数不仅可以返回内容,还可以指定 HTTP 状态码。

示例代码
@app.route('/status')defstatus():return'Everything is OK',200

返回状态码 200 表示请求成功。

返回带有状态码的响应对象:

示例代码
[email protected]('/error')deferror():returnResponse('An error occurred',status=500)

返回状态码 500 表示服务器内部错误。