基於django 開發的框架 jumpserver 原始碼解析(二)
阿新 • • 發佈:2018-12-23
django 上下文 context 以及 模板渲染引擎
當reques 到 達檢視類的時候,會根據 request 的 method 屬性 來呼叫相應 檢視類 的 方法,這是上一篇文章中分析的邏輯,接下來接著分析,檢視類 對資料庫的操作 以及 返回上下文物件給模板得 這一互動過程,下面貼出 原始碼。
class AssetListView(AdminUserRequiredMixin, TemplateView): template_name = 'assets/asset_list.html' def get_context_data(self, **kwargs): Node.root() context = { 'app': _('Assets'), 'action': _('Asset list'), 'labels': Label.objects.all().order_by('name'), 'nodes': Node.objects.all().order_by('-key'), } kwargs.update(context) return super().get_context_data(**kwargs)
就像AssetListView, jumpserver 大量運用了 get_context_data 方法,這個get_context_data 是重寫了父類 TemplateView 的父類的get_context_data,下面貼出原始碼。
class ContextMixin: """ A default context mixin that passes the keyword arguments received by get_context_data() as the template context. """ extra_context = None def get_context_data(self, **kwargs): kwargs.setdefault('view', self) if self.extra_context is not None: kwargs.update(self.extra_context) return kwargs
get_context_data 方法 其實就是元件 context 物件, 給 kwargs 增加新的鍵值對。
然後會呼叫 TemplateView 的get 方法 時候 會呼叫 get_context_data 方法 原始碼中是這樣的,在 get 方法中 呼叫了 get_context_data 方法。
class TemplateView(TemplateResponseMixin, ContextMixin, View): """ Render a template. Pass keyword arguments from the URLconf to the context. """ def get(self, request, *args, **kwargs): context = self.get_context_data(**kwargs) return self.render_to_response(context)
然後把 context 物件返回給前端。前端 頁面 程式碼類似於這樣。
{% for label in labels %}
<li><a style="font-weight: bolder">{{ label.name }}:{{ label.value }}</a></li>
{% endfor %}
接受到了 context 中的 label 陣列 。渲染引擎 就會 把 渲染 成頁面。