Djangoのソースコードの基礎15-viewsの簡単な分析の学習を深く学びます
2918 ワード
djangoではviewには2つの符号化形式がある.
1種類はfunction戻りです
1種類はclass戻りです
ぶんせき
viewsフォルダ
viewsディレクトリとdecoratorsディレクトリの下のファイルでは、主にいくつかの関数と装飾器をカプセル化し、関数がresponseのコードを返すのを容易にするために
genericディレクトリのコードについて.かっこいいと書いてあるような気がします.多重集積を用いてmvc分離を実現した.データソースを取得し、テンプレートをレンダリングします.ぶんかつ
以下に、コンパクトなプレゼンテーションコードを示します.具体的には分析しない
出力内容:
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"]