如何通过Django中间件在所有Django上下文中插入文本

15 投票
3 回答
9440 浏览
提问于 2025-04-16 17:29

这是我的中间件代码:

from django.conf import settings
from django.template import RequestContext

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

        return response

这是settings.py文件:

TEMPLATE_CONTEXT_PROCESSORS = (
    'django.core.context_processors.request',
)
MIDDLEWARE_CLASSES = (
    ...
    'middleware.BeforeFilter',
)

这是视图代码:

#coding:utf-8

from django.conf import settings
from django.shortcuts import render_to_response

from django.http import HttpResponse 
from django.template import RequestContext


def index(request):
    context = RequestContext(request)
    context['a'] = 'aaaa'
    return render_to_response('a.html',context)

这是HTML代码:

{{a}}fffff{{ss}}

但是它没有显示{{ss}}:

aaaafffff 

那么我该如何显示:

aaaafffffssssssss

如何通过Django中间件在所有Django上下文中插入一些文本,

这样我就不需要每次都插入文本了,

谢谢

3 个回答

1

提问者想知道如何通过中间件来实现这个功能,但我发现其实不需要这样做。现在被接受的答案有点过时,而且编辑队列也满了。

从Django 1.10开始,TEMPLATE_CONTEXT_PROCESSORS这个设置已经被移到了TEMPLATEScontext_processors选项里。

context_processors是一个包含了可以调用的Python路径的列表,这些调用会在渲染模板时用来填充上下文。它们会接收一个请求对象作为参数,并返回一个字典,这个字典里的内容会被合并到上下文中。默认情况下,这个列表是空的。

# context_processors.py

def sample_context_processor(request):
    return {'key': 'value'}

# settings.py

TEMPLATES = [
    {
        'OPTIONS': {
            'context_processors': [
                'myproject.context_processors.sample_context_processor',
            ],
        },
    },
]
3

你需要在模板中明确说明你要访问的是 request。如果你只是写 {{ss}},那么这个变量是不存在的,因为它是 request 的一个属性(你是用 request.ss = 'ssssssssss' 来设置的,对吧?)。所以在你的模板中应该写 {{request.ss}},这样就能正常工作了。

26

为了实现你的最初目标,我觉得不需要用BeforeFilter这个中间件。我们只需要一个模板上下文处理器就可以了。

你可以这样写一个上下文处理器:

#file: context_processors.py

def sample_context_processor(request):
   return {'ss':'ssssssssss'} #or whatever you want to set to variable ss

然后把这个上下文处理器添加到TEMPLATE_CONTEXT_PROCESSORS列表里。

#file: settings.py 

TEMPLATE_CONTEXT_PROCESSORS = (
    'myproject.context_processors.sample_context_processor',
)

撰写回答