https://docs.djangoproject.com/en/2.0/topics/class-based-views/
Django中View是一个可调用对象,接受一个request,并且返回一个response。view可以是一个简单的Python函数,但是也可以是一个可转化成view的类。使用类作为view,通过继承与混合,可以帮助你重用你的代码。
class 类型的view VS 函数型的view:
对于 view class,就是使用类的不同的实例方法来处理不同的http请求(而对于函数型view,在同一个方法中通过不同的代码分支(如if)来处理不同的http请求)
例如,对于函数型view,可能如下:
from django.http import HttpResponse
def my_view(request):
if request.method == 'GET':
#
return HttpResponse('result')
对于class类型view,则代码如下:
from django.http import HttpResponse
from django.views import View
class MyView(View):
def get(self, request):
#
return HttpResponse('result')
Django的URL解析器的工作模式是:将http请求和一个特定的可调用函数关联,并见httprequest对象传递给该函数。因此,对于基于类的view 会有(通过继承父类django.views.View)一个类方法as_view
。该方法的用处是:当请求达到时,返回一个和该请求匹配的函数,用于处理该请求。as_view
类方法创建一个类实例,然后调用它的dispatch方法。dispatch函数会根据请求类型(如get , post 等),返回具体的处理该类型的方法(如果找到的化,如果没有找到,则抛出HttpResponseNotAllowed 异常)
https://docs.djangoproject.com/en/2.0/topics/class-based-views/intro/
装饰基于类的view的最简单的方式是装饰as_view方法返回值。例如:
from django.contrib.auth.decorators import login_required, permission_required
from django.views.generic import TemplateView
from .views import VoteView
urlpatterns = [
path('about/', login_required(TemplateView.as_view(template_name="secret.html"))),
path('vote/', permission_required('polls.can_vote')(VoteView.as_view())),
]
另外,也可以直接装饰类。为了view class中的所有的响应方法都装饰到,你可以直接将装饰器加到dispatch方法上。但是,你需要注意的是:类中的方法和独立的python函数还是有区别的,因此你不能直接将函数装饰器应用到方法上,你首选需要使用method_decorator 来将一个函数装饰器转化成一个方法装饰器。例如:
from django.contrib.auth.decorators import login_required
from django.utils.decorators import method_decorator
from django.views.generic import TemplateView
class ProtectedView(TemplateView):
template_name = 'secret.html'
@method_decorator(login_required)
def dispatch(self, *args, **kwargs):
return super().dispatch(*args, **kwargs)
或者你可以直接将装饰器放到类上,将要被装饰的方法作为参数传入。例如:
@method_decorator(login_required, name='dispatch')
class ProtectedView(TemplateView):
template_name = 'secret.html'
当使用多个装饰器时,多个装饰器可以通过传入列表传入,例如:
decorators = [never_cache, login_required]
@method_decorator(decorators, name='dispatch')
class ProtectedView(TemplateView):
template_name = 'secret.html'
@method_decorator(never_cache, name='dispatch')
@method_decorator(login_required, name='dispatch')
class ProtectedView(TemplateView):
template_name = 'secret.html'
https://docs.djangoproject.com/en/2.0/topics/class-based-views/generic-display/
关于Django Form:https://blog.csdn.net/youyou1543724847/article/details/85992532
原文地址:https://www.jianshu.com/p/a2bf34b89d01
https://www.jianshu.com/p/0c08b0e2dcd6
(1)process_request(self, request)
request预处理函数
在Django接收到request之后,但仍未解析URL以确定应当运行的view之前。调用返回 None(Django将继续处理这个request,执行后续的中间件, 然后调用相应的view,“我对继续处理这个request没意见”)或者返回 HttpResponse 对象(Django 将不再执行任何其它的中间件(无视其种类)以及相应的view。 Django将立即返回该 HttpResponse,“我不想其他代码处理这个request,我要提早返回” ).
(2)process_view(self, request, callback, callback_args, callback_kwargs)
view预处理函数
在Django执行完request预处理函数并确定待执行的view之后,但在view函数实际执行之前。
(3)process_response(self, request, response)
Response后处理函数
在Django执行view函数并生成response之后
该处理器能修改response****的内容
(4)process_response
在这一点上,我们将有一个HttpResponse对象,可以是由视图或由WSGI处理程序构建的
process_view方法列表返回的,也可以轮流循环访问响应中间件。这是任何中间件都必须修改数据的最后机会,并且是从内层向外执行的(想象一下洋葱,视图在中心)。看一下缓存中间件源代码中的process_response实例:取决于应用程序中的不同条件(即缓存是否关闭,如果我们正在处理流等),我们需要响应存储在缓存中还是不存在。