只是在这里寻找一些关于如何在“Django时尚”中实现这个概念的指导。Django查看预处理
我正在使用dbsettings来定义站点级变量。在每个请求中,我想检查一个站点级变量,并根据该变量的值呈现不同的响应。
现在我意识到我只需在每个视图函数中添加一个简单的if语句就可以轻松完成此任务,但我认为可能有一种方法可以将其应用于更高级别的应用程序中?
让我知道是否有办法在所有请求中“全局化”此功能。谢谢。
只是在这里寻找一些关于如何在“Django时尚”中实现这个概念的指导。Django查看预处理
我正在使用dbsettings来定义站点级变量。在每个请求中,我想检查一个站点级变量,并根据该变量的值呈现不同的响应。
现在我意识到我只需在每个视图函数中添加一个简单的if语句就可以轻松完成此任务,但我认为可能有一种方法可以将其应用于更高级别的应用程序中?
让我知道是否有办法在所有请求中“全局化”此功能。谢谢。
实际上,如果设置将影响首先选择的模板或实质上影响响应,那么您真的可能需要的是middleware。这比使用模板上下文处理器更灵活,如果您只是想将几个变量添加到上下文中,则更合适。
您在创建自己的应用middleware.py,这可能包含这样的内容:
from django.conf import settings
class MyMiddleware(object):
def process_request(self, request):
request.my_app_setting = settings.MY_APP_SETTING
不要忘了你的类添加到您的MIDDLEWARE_CLASSES设置。
您可以使用自定义template context processors将“全局”上下文传递给您的视图。
要做到这一点,请在您的应用程序的某处创建一个新的contextprocessors.py,其代码类似于下面的示例(它只需要返回一个字典)。然后使用settings.py中的函数TEMPLATE_CONTEXT_PROCESSORS元组中的函数添加路径(即:yourapp.contextprocessors.resource_urls)。
from django.conf import settings
def resource_urls(request):
"""Passes global values to templates."""
return dict(
TIME_ZONE = settings.TIME_ZONE,
)
现在您可以按照预期在模板中引用这些键:{{ TIME_ZONE }}
。
对自定义视图装饰器有什么想法? – andersra 2013-03-12 03:27:06
似乎不太干我。你可以带上一点盐,但是我个人会在没有完全必要时避免装饰者。我喜欢它们,它们是一个非常强大的工具,但它们也可以使代码变得更加神秘。我看到一个,我想,现在这个功能可能已经成为阳光下的任何东西。另一方面,中间件的目的更多地局限于你的确切类型的问题,缺点是有点“不可思议”。但是很明显,随机请求属性必须来自中间件。 – acjay 2013-03-12 06:56:49
有了这个中间的解决方案,我没有看到你在哪里获得DRY优势。在视图中,我仍然必须检查request.my_app_setting,然后适当地重定向否?或者我可以检查此MyMiddleware对象中的request.my_app_setting的值,并相应地重定向? – andersra 2013-03-12 21:35:34