ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

Flask入门教程(二十二):应用对象API——Flask核心类详解

Flask入门教程(二十二):应用对象API——Flask核心类详解 1. 创建方式from flask import Flask app Flask(__name__)2. 构造函数参数以下是创建Flask实例时可以传递的全部参数参数类型默认值说明import_namestr必填应用模块/包名Flask用它定位模板和静态文件。单文件传递__name__包传递包名static_url_pathstrNone静态文件对外暴露的URL路径。不设置时使用static_folder的文件夹名static_folderstrstatic存放静态文件的文件夹路径static_hoststrNone静态文件路由的主机名仅在host_matchingTrue时需要host_matchingboolFalse是否按Host头匹配路由subdomain_matchingboolFalse是否启用子域名路由匹配template_folderstrtemplates存放Jinja2模板文件的文件夹路径instance_pathstrNone自动发现instance文件夹路径存储运行时不提交版本控制的文件instance_relative_configboolFalse为True时配置文件的相对路径基于instance_pathroot_pathstrNone自动发现应用的根路径通常自动推断3. 核心属性属性类型说明namestr应用名称configConfig配置字典对象存储所有配置项debugbool是否开启调试模式等价于config[DEBUG]testingbool是否开启测试模式等价于config[TESTING]secret_keystr安全密钥用于Session签名permanent_session_lifetimetimedelta永久Session的有效期默认31天url_mapMapWerkzeug的URL映射表存储所有路由规则view_functionsdictendpoint → 视图函数的映射字典blueprintsdict已注册的蓝图名称 → Blueprint实例映射extensionsdict扩展存储字典loggerLoggerPython标准logging.Loggerjinja_envEnvironmentJinja2环境实例jsonJSONProviderJSON处理提供者实例instance_pathstrinstance文件夹的绝对路径root_pathstr应用根目录的绝对路径4. 可重写的类属性以下属性可在子类中覆盖以自定义框架行为属性默认值说明request_classRequest用于创建请求对象的类response_classResponse用于创建响应对象的类session_interfaceSecureCookieSessionInterface()Session后端接口可替换为Redis/数据库Sessionjinja_environmentEnvironmentJinja2环境类app_ctx_globals_class_AppCtxGlobalsg对象的类config_classConfig配置对象的类json_provider_classDefaultJSONProviderJSON处理器的类5. URL路由方法方法签名说明route(rule, **options)装饰器将URL规则绑定到视图函数get(rule, **options)装饰器仅绑定GET方法post(rule, **options)装饰器仅绑定POST方法put(rule, **options)装饰器仅绑定PUT方法delete(rule, **options)装饰器仅绑定DELETE方法patch(rule, **options)装饰器仅绑定PATCH方法add_url_rule(rule, endpoint, view_func, **options)以编程方式添加URL规则url_for(endpoint, **values)根据endpoint和参数生成URLregister_blueprint(blueprint, **options)注册一个蓝图# 等价写法 app.route(/hello) def hello(): return Hello # 等价于 def hello(): return Hello app.add_url_rule(/hello, endpointhello, view_funchello)6. 请求生命周期钩子装饰器方法执行时机返回非None的行为典型用途before_request路由分发之前返回值作为最终响应跳过视图函数登录检查、权限验证after_request响应构建之后、发送之前必须接收并返回Response对象添加安全头、CORS头teardown_request请求上下文弹出时返回值被忽略释放请求级资源teardown_appcontext应用上下文弹出时返回值被忽略关闭数据库连接errorhandler指定状态码或异常发生时返回值作为错误页面的响应自定义404/500页面url_value_preprocessorURL变量提取后、视图调用前返回值被忽略对URL参数做预处理url_defaultsurl_for构建URL时修改传入的values字典为url_for添加默认参数template_filter注册性质—注册Jinja2模板过滤器template_global注册性质—注册Jinja2全局函数shell_context_processorflask shell启动时返回dict合并到shell上下文预导入常用对象7. 请求处理方法可重写以下方法在请求处理流程中被内部调用可在子类中重写方法说明preprocess_request(ctx)请求预处理执行before_request函数和URL预处理器dispatch_request(ctx)核心分发匹配URL调用对应视图函数make_response(rv)将视图函数的返回值转换为Response对象process_response(ctx, response)响应后处理执行after_request函数和Session保存finalize_request(ctx, rv)最终化调用make_response和after_requestfull_dispatch_request(ctx)完整的请求调度入口preprocess→dispatch→finalizehandle_exception(ctx, e)最终异常处理返回500响应8. 上下文管理方法说明app_context()创建应用上下文用with语句手动推入request_context(environ)根据WSGI environ创建请求上下文test_request_context(*args, **kwargs)创建模拟的请求上下文用于测试wsgi_app(environ, start_response)核心WSGI应用方法可包装中间件# 手动创建应用上下文 with app.app_context(): # current_app 和 g 可用 db.create_all() # 手动创建请求上下文测试用 with app.test_request_context(/hello?namerunoob): print(request.args[name]) # 输出: runoob9. 测试和开发工具方法说明test_client(use_cookiesTrue, **kwargs)创建测试客户端模拟浏览器发送请求test_cli_runner(**kwargs)创建CLI测试运行器用于测试自定义命令run(host, port, debug, **options)启动开发服务器仅开发环境make_shell_context()构建flask shell的上下文字典10. 工具方法方法说明redirect(location, code303)创建重定向响应对象send_static_file(filename)从static_folder发送文件open_resource(resource, moderb)以二进制模式打开root_path下的资源文件open_instance_resource(resource, moderb)打开instance_path下的资源文件11. 完整代码示例from flask import Flask, request, session, redirect, url_for, render_template from datetime import timedelta # 1. 创建应用 app Flask(__name__, template_foldertemplates, static_folderstatic, instance_relative_configTrue) # 2. 配置 app.secret_key your-secret-key app.config[PERMANENT_SESSION_LIFETIME] timedelta(days7) app.config[MAX_CONTENT_LENGTH] 16 * 1024 * 1024 # 3. 路由 app.route(/) def index(): return h1Hello, RUNOOB!/h1 app.route(/user/username) def user(username): return fh1用户: {username}/h1 # 4. 钩子 app.before_request def check_auth(): if request.endpoint not in (login, static): if username not in session: return redirect(url_for(login)) app.after_request def add_header(response): response.headers[X-Custom-Header] RUNOOB return response app.teardown_appcontext def close_db(error): from flask import g db g.pop(db, None) if db is not None: db.close() # 5. 错误处理 app.errorhandler(404) def not_found(error): return h1页面未找到/h1, 404 app.errorhandler(500) def internal_error(error): app.logger.error(f服务器错误: {error}) return h1服务器内部错误/h1, 500 # 6. 自定义CLI命令 app.cli.command(hello) def hello_command(): 打印问候语 print(Hello from RUNOOB Flask App!)12. 常用API速查表操作代码创建应用app Flask(__name__)设置配置app.config[KEY] value定义路由app.route(/path)添加钩子app.before_request错误处理app.errorhandler(404)生成URLurl_for(endpoint, keyvalue)创建上下文with app.app_context():测试请求with app.test_request_context():创建测试客户端client app.test_client()启动开发服务器app.run(debugTrue)小结本章全面讲解了Flask应用对象的完整API。构造函数支持static_folder、template_folder、instance_path等参数核心属性包括config、debug、secret_key、url_map、view_functions等路由方法有route、get、post、add_url_rule、url_for、register_blueprint生命周期钩子包括before_request、after_request、teardown_appcontext、errorhandler上下文管理通过app_context()和test_request_context()实现测试工具包括test_client()和test_cli_runner()。Flask类是框架的绝对核心深入理解其API对开发高质量Flask应用至关重要。
返回列表