Flask全局资源高级用法

大数据
后台-插件-广告管理-内容页头部广告(手机)

在Flask中,除了g对象之外,还有其他的全局资源可以使用。以下是一些高级用法:

1. 自定义请求处理器

Flask允许你创建自定义的请求处理器,这些处理器可以在请求生命周期的不同阶段执行。例如:

before_request:在每个请求之前执行,但不包括错误页面请求。

after_request:在每个响应生成后执行,但不包括错误页面请求。

teardown_request:在每个请求生命周期的最后执行。

这些钩子可以用来设置或清理全局变量:

@app.before_request
def before_request():
global global_var
global_var = 'This is set globally for this request'

@app.after_request
def after_request(response):
response.headers['X-Custom-Header'] = global_var
return response

@app.teardown_request
def teardown_request(exception):
pass


2. 日志记录器

你可以配置一个全局日志记录器来跟踪应用程序的运行情况:

import logging

app.logger.setLevel(logging.DEBUG)

@app.before_first_request
def configure_logging():
file_handler = logging.FileHandler("app.log")
file_handler.setLevel(logging.INFO)
stream_handler = logging.StreamHandler()
stream_handler.setLevel(logging.DEBUG)

# Create formatter and add it to the handlers
formatter = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s')
file_handler.setFormatter(formatter)
stream_handler.setFormatter(formatter)

# Add the handlers to the root logger
app.logger.addHandler(file_handler)
app.logger.addHandler(stream_handler)

@app.before_request
def log_request():
app.logger.info(f"Handling request for {request.endpoint}")


3. 全局蓝本(Blueprints)

蓝本是一种组织代码的方式,可以让你把应用分割成小的、可重用的组件。通过全局变量,你可以定义一些蓝本,并在应用的其他部分使用它们:

from flask import Blueprint

mod = Blueprint('module', __name__)

@mod.route('/module-route')
def module_route():
return 'This is a module route'

app.register_blueprint(mod)


4. 全局模板上下文

你可以在渲染模板之前向全局上下文字典添加数据:

from flask import render_template, g

@app.context_processor
def inject_data_into_templates():
def get_user():
return g.user if 'user' in g else None

return dict(user=get_user)

@app.before_request
def before_request():
g.user = 'Some User'


5. 全局错误处理器

你可以定义一个全局错误处理器来捕获和处理所有未处理的异常:

@app.errorhandler(500)
def internal_error(exception):
app.logger.error("An internal error occurred:", exception)
return "Something went wrong", 500

@app.errorhandler(404)
def page_not_found(exception):
return "Page not found", 404


6. 全局信号处理器

Flask支持Python的signals机制,允许你定义全局信号处理器:

from flask import signal

user_loaded = signal.signal(lambda sender, user_id, **kwargs: print("User loaded with ID:", user_id))

@app.before_request
def before_request():
user_loaded.send(app, user_id=g.user.id)


7. 全局静态文件和模板

你可以使用static和template_folder属性来指定全局静态文件目录和模板目录:

app = Flask(__name__, static_folder='static', template_folder='templates')


以上就是Flask中全局变量的几种高级使用方式。通过合理地使用全局变量,可以提高代码的可重用性和组织性,但也需要注意避免过度依赖全局状态,因为这可能使代码难以测试和维护。

后台-插件-广告管理-内容页尾部广告(手机)
标签:

评论留言

我要留言

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。