Django View

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类型的view:易于扩展,代码重用,但是可能会比函数型的view稍稍难以上手。

1 使用基于类的view

对于 view class,就是使用类的不同的实例方法来处理不同的http请求(而对于函数型view,在同一个方法中通过不同的代码分支(如if)来处理不同的http请求)

例如,对于函数型view,可能如下:

from django.http import HttpResponse

def my_view(request):
    if request.method == 'GET':
        # <view logic>
        return HttpResponse('result')

对于class类型view,则代码如下:

from django.http import HttpResponse
from django.views import View

class MyView(View):
    def get(self, request):
        # <view logic>
        return HttpResponse('result')

Django的URL解析器的工作模式是:将http请求和一个特定的可调用函数关联,并见httprequest对象传递给该函数。因此,对于基于类的view 会有(通过继承父类django.views.View)一个类方法as_view。该方法的用处是:当请求达到时,返回一个和该请求匹配的函数,用于处理该请求。as_view类方法创建一个类实例,然后调用它的dispatch方法。dispatch函数会根据请求类型(如get , post 等),返回具体的处理该类型的方法(如果找到的化,如果没有找到,则抛出HttpResponseNotAllowed 异常)

1.1 基于类的view的装饰器

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'

2. 内置的通用view

https://docs.djangoproject.com/en/2.0/topics/class-based-views/generic-display/

3. 使用基于类的view处理form表单

关于Django Form:https://blog.csdn.net/youyou1543724847/article/details/85992532

4. 完整的Django 处理http请求流程

原文地址: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实例:取决于应用程序中的不同条件(即缓存是否关闭,如果我们正在处理流等),我们需要响应存储在缓存中还是不存在。

  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值