Djangoのソースコードの基礎15-viewsの簡単な分析の学習を深く学びます

2918 ワード

djangoではviewには2つの符号化形式がある.
1種類はfunction戻りです
1種類はclass戻りです
ぶんせき
viewsフォルダ
views
|----decorators
     |----__init__.py
     |----cache.py
     |----clickjacking.py
     |----csrf.py
     |----debug.py
     |----gzip.py
     |----http.py
     |----vary.py
|----generic
     |----__init__.py
     |----base.py
     |----dates.py
     |----detail.py
     |----edit.py
     |----list.py
|----__init__.py
|----csrf.py
|----defaults.py
|----i18n.py
|----static.py

viewsディレクトリとdecoratorsディレクトリの下のファイルでは、主にいくつかの関数と装飾器をカプセル化し、関数がresponseのコードを返すのを容易にするために
genericディレクトリのコードについて.かっこいいと書いてあるような気がします.多重集積を用いてmvc分離を実現した.データソースを取得し、テンプレートをレンダリングします.ぶんかつ
以下に、コンパクトなプレゼンテーションコードを示します.具体的には分析しない
from functools import update_wrapper

class ContextMixin(object):
    def get_context_data(self, **kwargs):
        print 'get contenxt'
        if 'view' not in kwargs:
            kwargs['view'] = self
        return kwargs

class View(object):
    http_method_names = ['get','post','put','delete']
    def __init__(self, **kwargs):
        for (k, v) in kwargs.items():
            setattr(self, k, v)

    @classmethod
    def as_view(cls, **initkwargs):
        for key in initkwargs:
            if key in cls.http_method_names:
                raise "can't set httpmethod key"

        def view(request, *args, **kwargs):
            self = cls(**initkwargs)
            self.request = request
            self.args = args
            self.kwargs = kwargs
            return self.dispatch(request, *args, **kwargs)

        update_wrapper(view, cls, updated=())
        update_wrapper(view, cls.dispatch, updated=())

        return view

    def dispatch(self, request, *args, **kwargs):
        if request.method.lower() in self.http_method_names:
            handler = getattr(self, request.method.lower())
        else:
            raise "Can't dispatch request"
        return handler(request, *args, **kwargs)

class TemplateResponseMixin(object):
    template_name = None

    def render_to_response(self, context, **response_kwargs):
        print 'render context:[%s] to html["%s"]' % (context, self.template_name)


class TemplateView(TemplateResponseMixin, ContextMixin, View):
    def get(self, request, *args, **kwargs):
        context = self.get_context_data(**kwargs)
        return self.render_to_response(context)


class AboutView(TemplateView):
    template_name = 'about.html'

class Request(object):
    def __init__(self, method = 'get'):
        self.method = method

AboutView.as_view(template_name='1.html')(Request())

出力内容:
get contenxt
render context:[{'view': <__main__.AboutView object at 0x103bd8e10>}] to html["1.html"]