哦,上下文变量
為什么80%的碼農(nóng)都做不了架構(gòu)師?>>> ??
最近項(xiàng)目中遇到一個(gè)問題:
有一個(gè)base.html,前臺(tái)頁面基本都會(huì)extends這個(gè)base.html
base.html頁面內(nèi)有兩個(gè)變量,需要views傳入。要是有個(gè)幾百個(gè)繼承base.html的頁面,每個(gè)頁面需要一個(gè)views,那得是都大的工作量。
上下文變量不錯(cuò):
RequestContext?
class RequestContext(Context):
? ? """
? ? This subclass of template.Context automatically populates itself using
? ? the processors defined in TEMPLATE_CONTEXT_PROCESSORS.
? ? Additional processors can be specified as a list of callables
? ? using the "processors" keyword argument.
? ? """
? ? def __init__(self, request, dict_=None, processors=None, current_app=None,
? ? ? ? ? ? use_l10n=None, use_tz=None):
? ? ? ? Context.__init__(self, dict_, current_app=current_app,
? ? ? ? ? ? ? ? use_l10n=use_l10n, use_tz=use_tz)
? ? ? ? if processors is None:
? ? ? ? ? ? processors = ()
? ? ? ? else:
? ? ? ? ? ? processors = tuple(processors)
? ? ? ? for processor in get_standard_processors() + processors:
? ? ? ? ? ? self.update(processor(request))
RequestContext繼承了Context,擴(kuò)展了Context,最主要的就是紅色的那兩句,
get_standard_processors()?
通過查看方法可以知道是獲取在settings文件中?每個(gè)要被執(zhí)行的處理器函數(shù)
TEMPLATE_CONTEXT_PROCESSORS = (
? ? "django.contrib.auth.context_processors.auth",
? ? "django.core.context_processors.debug",
? ? "django.core.context_processors.request",
? ? "django.core.context_processors.media",
)
一個(gè)請(qǐng)求進(jìn)來時(shí)的過程 ?url 找到 對(duì)應(yīng)的views, return (上下文變量就是在返回時(shí)對(duì)request做了一些事,主要就是返回一個(gè)字典,類似于return {
? ? ? ? 'user': user,
? ? ? ? 'perms': PermWrapper(user),
? ? }
然后我們?cè)谀0寰褪强梢允褂梅祷貋淼闹盗?,
方法一:只要我們?cè)趕ettings中TEMPLATE_CONTEXT_PROCESSORS定義了一個(gè)處理器,那我們使用RequestContext就不需要重復(fù)定義每個(gè)頁面都需要的變量了。缺點(diǎn)就是每個(gè)views都使用了定義的處理器,如果不想讓每個(gè)views都被處理那?
方法二:如果不是很多頁面公用變量,而只有一部分,只針對(duì)指定的views使用指定的處理器
return ?render_to_response(template_name,extra_context,context_instance=RequestContext(request,processors=[xxxxx]))
原理就是for processor in get_standard_processors() + processors:
? ? ? ? ? ??self.update(processor(request))
在獲取了一開始初始settings設(shè)置的processor,同時(shí)也加入了我們自定義的一個(gè)處理器,這樣我們針對(duì)想要使用處理器的views單獨(dú)指定。
轉(zhuǎn)載于:https://my.oschina.net/012345678/blog/170351
總結(jié)
- 上一篇: Java序列化(Serializatio
- 下一篇: iOS 7 二维码的生成