1. 程式人生 > >基於django 開發的框架 jumpserver 原始碼解析(二)

基於django 開發的框架 jumpserver 原始碼解析(二)

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 陣列 。渲染引擎 就會 把 渲染 成頁面。