Django中全局Context处理器

1.模板标签和模板变量

模板标签在{% %}中定义:

{% if is_logged_in %}
    Thanks for logging in!
{% else %}
    Please log in.
{% endif %}

模板变量在 {  }中定义:

My first name is {{ first_name }}. My last name is {{ last_name }}.

2.Context处理器和 RequestContext处理器

context 是一个传递给模板的名称到值的映射(类似Python字典)。通过从context获取值来替换模板中变量并执行所有的模板标签来实现模板渲染。

from django.template import loader, Context

def view_1(request):
    # ...
    t = loader.get_template(‘template1.html‘)
    c = Context({
        ‘app‘: ‘My app‘,
        ‘user‘: request.user,
        ‘ip_address‘: request.META[‘REMOTE_ADDR‘],
        ‘message‘: ‘I am view 1.‘
    })
    return t.render(c)

def view_2(request):
    # ...
    t = loader.get_template(‘template2.html‘)
    c = Context({
        ‘app‘: ‘My app‘,
        ‘user‘: request.user,
        ‘ip_address‘: request.META[‘REMOTE_ADDR‘],
        ‘message‘: ‘I am the second view.‘
    })
    return t.render(c)

在上述代码中定义了两个视图,他们除了message不同其余信息都相同,而这样分别定义显然是冗余的。所以需要引入 RequestContext处理器。

from django.shortcuts import render_to_response
from django.template import RequestContext

def custom_proc(request):   # context处理器,它接收一个 HttpRequest 对象,然后返回一个字典
    "A context processor that provides ‘app‘, ‘user‘ and ‘ip_address‘."
    return {
        ‘app‘: ‘My app‘,
        ‘user‘: request.user,
        ‘ip_address‘: request.META[‘REMOTE_ADDR‘]
    }

def view_1(request):
    # ...
    return render_to_response(‘template1.html‘,
        {‘message‘: ‘I am view 1.‘},
        context_instance=RequestContext(request, processors=[custom_proc])) # 接受processors参数

def view_2(request):
    # ...
    return render_to_response(‘template2.html‘,
        {‘message‘: ‘I am the second view.‘},
        context_instance=RequestContext(request, processors=[custom_proc]))

上述代码中利用 render_to_response 代替了render使得可以不用手动载入模板。值得注意的是,在上面这种方法中虽然看似减少了冗余代码,但是由于需要不断键入processors参数,所以依然不够简洁。

所以djang提供对全局 context 处理器的支持。在settings.py 中,有类似代码:

TEMPLATES = [
    {
        ‘BACKEND‘: ‘django.template.backends.django.DjangoTemplates‘,
        ‘DIRS‘: [
            os.path.join(BASE_DIR, ‘templates‘)
        ],
        ‘APP_DIRS‘: True,
        ‘OPTIONS‘: {
            ‘context_processors‘: [   # 以下定义了默认的全局文本处理器
                ‘django.template.context_processors.debug‘,
                ‘django.template.context_processors.request‘,
                ‘django.contrib.auth.context_processors.auth‘,
                ‘django.contrib.messages.context_processors.messages‘,
                ‘blog.views.custom_proc‘,  # 见下文代码
            ],
        },
    },
]

以下方法实现全局化文本处理器。

  • 建议在项目的应用(app)或项目(project)下创建一个叫做context_processors.py的文件。只要它们存放在你的Python的搜索路径中,它们放在哪个物理路径并不重要,这样你可以在CONTEXT_PROCESSORS设置里指向它们。
  • 在context_processors.py中创建你需要定义的处理器,使每个context处理器完成尽可能小的功能。
  • 将该文本处理器引入到 context_processors 目录下,如上文代码。

特别的,不去额外定义 context_processors.py ,而在 views.py 中直接写好 custom_proc 后,则可以将其目录加入到  context_processors 中。eg:上述代码中的 def custom_proc(request):

3.  调用 settings.py 中的配置信息作为全局调用

  • 在 settings.py 中加入你要替换的信息:
SITE_NAME = ‘。。。的个人博客‘
SITE_DESC = ‘Python开发 && Django开发‘
  • 在 views.py 中引入参数:
from django.conf import settings
def global_setting(request):
    return {‘SITE_NAME‘: settings.SITE_NAME,
            ‘SITE_DESC‘: settings.SITE_DESC,}
  • 在 settings.py 中 TEMPLATE的文本处理器中加入

    ‘blog.views.global_setting‘,

至此,这种方法也不需要在render 或 render_to_response 中指明 context 或 RequestContext 就可以直接在HTML模板中利用模板变量来进行渲染。

相比之下,还是方法2中较简单。

时间: 2024-10-30 19:28:16

Django中全局Context处理器的相关文章

Spring Boot 中全局异常处理器

Spring Boot 中全局异常处理器,就是把错误异常统一处理的方法.等价于Springmvc中的异常处理器. 步骤一:基于前面的springBoot入门小demo修改 步骤二:修改HelloController类 修改HelloController,使得访问/hello一定会产生异常: some exception package cn.xdf.springboot.web; import java.text.DateFormat; import java.util.Date; import

springmvc中拦截器与springmvc全局异常处理器的问题

最近在做一个练手的小项目, 系统架构中用了springmvc的全局异常处理器, 做了系统的统一异常处理. 后来加入了springmvc的拦截器, 为了一些需求, 在拦截器中的 preHandle 方法 中抛出了系统自定义异常, 当时有有个疑惑, 就是抛出的这个异常全局异常处理器怎么处理的. 这里的全局异常处理器时通过实现HandlerExceptionResolver这个借口实现的 要指出的是 resolveException方法 中 handler中代表的是什么,我没遇到这个问题之前我认为这玩

Python的Django框架中的Context使用

Python的Django框架中的Context使用 一旦你创建一个 Template 对象,你可以用 context 来传递数据给它. 一个context是一系列变量和它们值的集合. context在Django里表现为 Context 类,在 django.template 模块里. 她的构造函数带有一个可选的参数: 一个字典映射变量和它们的值. 调用 Template 对象 的 render() 方法并传递context来填充模板: >>> from django.template

Django框架中的Context使用

Django框架中的Context使用 2017年11月09日 20:01:09 aweilark 阅读数:1113 转载自:http://www.aichengxu.com/python/60625.htm 一旦你创建一个 Template 对象,你可以用 context 来传递数据给它. 一个context是一系列变量和它们值的集合. context在Django里表现为 Context 类,在 django.template 模块里. 她的构造函数带有一个可选的参数: 一个字典映射变量和它

django中的cookies和session机制

0.概述 (1)为什么要有cookies和session 在网站中,http请求是无状态的.也就是说即使第一次和服务器连接后并且登录成功后,第二次请求服务器依然不能知道当前请求是哪个用户.而在现实网站中,那淘宝网来举例,用户将商品加入购物车和用户付款是不同的请求,但这个这连个请求需要是同一个用户,而这样的使用场景很多.总结来说,cookies和session一种用户识别用户身份的解决方案. (2)cookies 第一次登录后服务器返回一些数据(cookie)给浏览器,然后浏览器保存在本地,当该用

django中的分页设置

1.在控制台中的展示 from django.core.paginator import Paginator iter = 'abcdefghijklmn' inator = Paginator(iter, 5) page1 = inator.page(1) page1.object_list # 输出当前也的内容 'abcde' page1.number # 输出页码 1 page1.has_next() # 输出是否有下一页 True page1.next_page_number() # 输

绝对让你理解Android中的Context

这个问题是StackOverFlow上面一个热门的问题What is Context in Android? 整理这篇文章的目的是Context确实是一个很抽象的东西,我们在项目中随手都会用到它,可是很多人根本不理解它到底是干什么的,这篇文章还会添加Context in Andorid – INSIGHT的翻译,绝对让读者理解Context的意义. 老规矩,作者提出的问题: 在Android中,Context到底是个什么鬼东西,它到底是干嘛使得,我读了很多篇文档,然而并不能清除的理解它的含义.

django中templates阅读笔记

一.基本知识 1.模版是独立于django的,可以独立运行. 模版变量是用两个大括号括起来的字符串,表示变量.例如{{ person_name }} 模版标签,是用一对大括号和一对百分号括起来的,例如{% if ordered_warranty %},{% for item in item_list %} 过滤器,修改变量格式.{{ ship_date|date:"F j, Y" }} 2.产生TemplateSyntaxError异常的原因有 Invalid tags Invalid

Python笔记(五)--Django中使用模板

使用Django开发网站时,如果不使用模板,那么将会很不合理.因为我们所有的html代码都需要被硬编码到我们的Python代码中.我们新建一个工程,然后再在新建一个应用程序,并在其中的views.py文件中添加如下代码: 1 #coding=UTF-8 2 from django.http.response import HttpResponse, Http404 3 import datetime 4 5 def hours_ahead(request,offset): 6 try: 7 of