上下文处理器用来处理返回给全局模板的数据,可以通过上下文处理器统一给上下文附加数据,这样一来,就无需在每个视图函数中实现重复的逻辑。
一、内置上下文处理器
在settings.TEMPLATES.OPTIONS.context_processors
中,有许多内置额上下文处理器。这些上下文处理器的作用如下:
django.template.context_processors.debug
:附加一个debug
变量,其值为settings.DEBUG
的值;附加一个sql_queries
变量,在模板中可以通过该变量查看请求当前页面时数据库执行的sql
语句;django.template.context_processors.request
:附加一个request
变量,封装了当前页面发送请求时的request
对象,一般用来获取当前页面的路径;django.contrib.auth.context_processors.auth
:通过Django
内置的用户系统,给上下文附加一个user
对象;django.contrib.messages.context_processors.messages
:增加一个messages
变量;django.template.context_processors.media
:能够在模板中通过{{MEDIA_URL}}
来使用settings.py
中配置的MEDIA_URL
,这样,就可以在前端访问上传到服务器的文件;django.template.context_processors.static
:在模板中可以使用STATIC_URL
标签;django.template.context_processors.csrf
:在模板中可以使用{{csrf_token}}
变量来生成一个csrf token
。
二、自定义上下文处理器
可以自定义上下文处理器,其本质上就是一个函数。可以在app
目录下创建一个py
文件,用来存放所有需读取该app
数据的上下文处理器;也可以在项目文件夹下,创建一个包用来存放所有实现微处理器。
对于自定义的上下文处理器,该函数只传入一个request
参数。在该函数内实现所需逻辑后,将需要返回模板的数据直接通过字典的形式返回。如果不需要返回任何数据,也必须返回一个空字典。
示例代码:
def frontuser(request):
userid = request.session.get("userid")
userModel = models.FrontendUser.objects.filter(pk=userid).first()
if userModel:
return {'frontuser':userModel}
else:
return {}
定义完处理器后,还需在settings.TEMPLATES.OPTIONS.context_processors
中进行注册,注册的起始环境为项目文件夹:
TEMPLATES = [
{
'BACKEND': 'django.template.backends.django.DjangoTemplates',
'DIRS': [],
'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',
# app文件夹.上下文处理器所在的模块.上下文处理器的函数名
'front.context_processors.front_user',
],
},
},
]