当前位置:  开发笔记 > 编程语言 > 正文

Django - 让中间件与视图/模板进行通信

如何解决《Django-让中间件与视图/模板进行通信》经验,为你挑选了2个好方法。

好吧,这可能是一个非常愚蠢的问题,但我是Python/Django的新手,所以我还不能真正地围绕它的范围概念.现在我正在编写一个中间件类来处理一些东西,我想设置我的视图和模板可以访问的"全局"变量.这样做的"正确"方法是什么?我考虑做过这样的事情:

middleware.py

from django.conf import settings

class BeforeFilter(object):
    def process_request(self, request):
        settings.my_var = 'Hello World'
        return None

views.py

from django.conf import settings
from django.http import HttpResponse

def myview(request):
    return HttpResponse(settings.my_var)

虽然这有效,但我不确定它是"Django方式"还是"Python方式".

所以,我的问题是:
1.这是正确的方法吗?
2.如果它是正确的方法,添加可以在中间件的实际模板中使用的变量的正确方法是什么?说我想评估一些东西,我想headername在中间件中将变量设置为"我的站点名称",我希望能够{{ headername }}在所有模板中进行.按照我现在的方式进行,我必须headername在每个视图中添加上下文.反正有没有绕过这个?我正在考虑CakePHP的$this->set('headername','My Site Name');
3 行.我使用中间件类作为CakePHP的等价物beforeFilter,它在每个视图(或CakePHP中的控制器)被调用之前运行.这是正确的做法吗?
4.完全不相关,但这是一个小问题,将一个变量的内容打印到浏览器ala的好方法是print_r什么?说我想看到里面的所有内容request都传递到视图中?pprint答案是答案吗?



1> Akbar ibrahi..:

    这不是最好的方式.您可以在请求而不是设置上设置my_var.设置是全局的,适用于整个站点.您不希望为每个请求修改它.多个请求同时更新/读取变量可能会出现并发问题.

    要在模板中访问request.my_var,您可以执行{{request.my_var}}.要访问模板中的请求变量,必须将django.core.context_processors.request添加到TEMPLATE_CONTEXT_PROCESSORS设置中.

    是.描述请求中间件的其他术语将是请求预处理器/过滤器/拦截器.

此外,如果要在模板中使用标题的常用站点名称,您可能需要查看Django站点应用程序,该应用程序提供了一个站点名称变量供您使用.



2> S.Lott..:

这就是我们的工作.我们使用像这样的上下文处理器......

def context_myApp_settings(request):
    """Insert some additional information into the template context
    from the settings.
    Specifically, the LOGOUT_URL, MEDIA_URL and BADGES settings.
    """
    from django.conf import settings
    additions = {
        'MEDIA_URL': settings.MEDIA_URL,
        'LOGOUT_URL': settings.LOGOUT_URL,
        'BADGES': settings.BADGES,
        'DJANGO_ROOT': request.META['SCRIPT_NAME'],
    }
    return additions

这里激活了这个设置.

TEMPLATE_CONTEXT_PROCESSORS = (
    "django.core.context_processors.auth",
    "django.core.context_processors.debug",
    "django.core.context_processors.i18n",
    "django.core.context_processors.media",
    "django.core.context_processors.request",
    "myapp. context_myApp_settings",
    )

这在呈现的每个模板的上下文中提供"全局"信息.这是标准的Django解决方案.有关上下文处理器的更多信息,请参见http://docs.djangoproject.com/en/dev/ref/templates/api/#ref-templates-api.


"将变量内容打印到浏览器ala print_r的好方法是什么?"

在视图中?您可以为pprint.pformat要呈现的模板提供字符串以进行调试.

在日志中?您必须使用Python的logging模块并将内容发送到单独的日志文件.使用简单的print语句将内容写入日志对于所有Django实现都不能很好地保持一致(例如,mod_python会丢失所有stdout和stderr的东西.)

推荐阅读
mobiledu2402851377
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有