ARTICLE DETAIL

建站实战干货

来自一线的建站与推广经验沉淀,每一条都经过真实交付验证。

Flask入门教程(八):视图函数详解——请求处理与响应的核心

2026/8/29 5:54:08 拓冰建站 浏览量
Flask入门教程(八):视图函数详解——请求处理与响应的核心 1. 定义视图函数视图函数是一个普通的Python函数它接收请求并返回响应。视图函数通常与路由配合使用通过装饰器将URL映射到视图函数。from flask import Flask app Flask(__name__) app.route(/) def home(): return Hello, World!app.route(/)将根URL/映射到home视图函数def home()视图函数返回字符串作为响应2. 接收请求数据视图函数可以接收不同类型的请求数据包括URL参数、表单数据、查询参数等。获取URL参数动态路由app.route(/greet/name) def greet(name): return fHello, {name}!name是一个URL参数Flask会自动将其传递给视图函数greet的同名参数。获取表单数据POST请求from flask import request app.route(/submit, methods[POST]) def submit(): username request.form.get(username) return fForm submitted by {username}!request.form.get(username)获取POST请求中表单数据的username字段。获取查询参数GET请求app.route(/search) def search(): query request.args.get(query) return fSearch results for: {query}request.args.get(query)获取GET请求URL中的查询参数query如/search?queryflask。3. 返回响应视图函数可以返回多种类型的响应包括字符串、HTML模板、JSON数据或自定义响应对象。返回字符串app.route(/message) def message(): return This is a simple message.返回HTML模板from flask import render_template app.route(/hello/name) def hello(name): return render_template(hello.html, namename)render_template(hello.html, namename)渲染HTML模板hello.html并将name变量传递给模板。返回JSON数据from flask import jsonify app.route(/api/data) def api_data(): data {key: value, list: [1, 2, 3]} return jsonify(data)jsonify(data)将Python字典转换为JSON响应并自动设置Content-Type为application/json。在Flask 2.2中直接返回字典或列表也会自动调用jsonify()因此可以简写为return data。返回自定义响应对象from flask import Response app.route(/custom) def custom_response(): response Response(Custom response with headers, status200) response.headers[X-Custom-Header] Value return responseResponse()创建自定义响应对象可以设置状态码和响应头。4. 处理请求和响应视图函数可以访问请求对象并根据请求数据生成响应。使用request对象from flask import request app.route(/info) def info(): user_agent request.headers.get(User-Agent) method request.method path request.path return fMethod: {method}, Path: {path}, User-Agent: {user_agent}使用make_response创建响应from flask import make_response app.route(/header) def custom_header(): response make_response(Response with custom header) response.headers[X-Custom-Header] Value response.set_cookie(theme, dark) return responsemake_response()创建响应对象并支持设置自定义头信息、Cookie等。5. 处理错误可以在视图函数中处理异常或错误也可以通过Flask提供的错误处理机制来处理应用中的错误。在视图函数中处理错误try-exceptapp.route(/divide/int:x/int:y) def divide(x, y): try: result x / y return fResult: {result} except ZeroDivisionError: return Error: Division by zero, 400使用try-except语句处理除零错误并返回自定义错误消息和状态码。使用abort终止请求from flask import abort app.route(/post/int:post_id) def view_post(post_id): # 假设文章ID有效范围是1-100 if post_id 1 or post_id 100: abort(404, description文章不存在) return fh1文章 #{post_id}/h1全局错误处理app.errorhandler(404) def not_found(error): return Page not found, 404 app.errorhandler(500) def internal_error(error): return Internal server error, 500 app.errorhandler(ZeroDivisionError) def handle_zero_division(error): return Cannot divide by zero, 400app.errorhandler()定义处理特定错误或异常的函数可以捕获HTTP错误码或Python异常类。6. 视图函数的装饰器请求钩子除了app.routeFlask还提供了多种装饰器用于在请求处理的不同阶段执行自定义逻辑。装饰器触发时机典型用途app.before_request每个请求处理之前权限验证、数据库连接、请求日志app.before_first_request第一个请求处理之前仅一次初始化全局资源app.after_request每个请求处理之后返回响应之前添加响应头、压缩响应内容app.teardown_request请求结束后无论是否有异常释放资源、关闭数据库连接示例请求钩子使用app.before_request def before_request(): print(Before request) # 可以在这里做用户认证检查 # 如果未认证可以返回响应提前终止请求 app.after_request def after_request(response): print(After request) # 添加自定义响应头 response.headers[X-Request-Time] 123ms return response app.teardown_request def teardown_request(exception): print(Teardown request) # 清理资源如关闭数据库连接 # 如果有异常exception参数包含异常对象多个钩子的执行顺序请求到达 │ ▼ app.before_request按注册顺序执行 │ ▼ 路由匹配 → 视图函数执行 │ ▼ app.after_request按注册逆序执行 │ ▼ 响应返回客户端 │ ▼ app.teardown_request异常时也执行7. 视图函数返回的状态码视图函数不仅可以返回内容还可以指定HTTP状态码来表示请求的处理结果。# 返回状态码200成功 app.route(/status) def status(): return Everything is OK, 200 # 返回状态码201创建成功 app.route(/create, methods[POST]) def create(): return {id: 1, message: Created}, 201 # 返回状态码400请求错误 app.route(/validate) def validate(): return Invalid input, 400 # 返回状态码401未认证 app.route(/protected) def protected(): return Authentication required, 401 # 返回状态码403无权限 app.route(/admin) def admin(): return Access forbidden, 403 # 返回状态码404未找到 app.route(/old-page) def old_page(): return Page not found, 404 # 返回状态码500服务器内部错误 app.route(/error) def error(): return Response(Internal server error, status500)8. 视图函数返回值类型汇总返回类型示例Flask自动处理strreturn Hello作为HTML响应体200 OKdictreturn {key: value}转为JSON响应200 OKlistreturn [1, 2, 3]转为JSON响应200 OKtuplereturn body, 404自定义状态码tuplereturn body, {X-Header: v}自定义响应头Responsereturn Response(body, status200)完全控制的响应render_template()return render_template(page.html)HTML模板渲染jsonify()return jsonify(data)JSON响应redirect()return redirect(/login)302重定向abort()abort(404)错误响应小结本章详细讲解了Flask视图函数的完整知识体系。视图函数通过路由装饰器与URL绑定通过request对象获取URL参数、表单数据、查询参数等请求信息响应方面可以返回字符串、模板、JSON或自定义响应对象错误处理可以通过try-except、abort()或app.errorhandler()实现请求钩子app.before_request、app.after_request等允许在请求处理的不同阶段执行统一逻辑视图函数还可以通过元组或Response对象灵活指定状态码。这些知识构成了Flask应用业务逻辑编写的完整基础。