23. 类视图,as_view

as_view() 基于类的视图
属性:
http_method_names
方法:
as_view()
dispatch()
http_method_not_allowed()

原理讲解,伪代码

示例一: 伪代码

from django.http import HttpResponse
# Create your views here.

class Users(object):
    def as_view(self):
        def view(request, *args, **kwargs):
            '''
            if hasattr(self,request.method.lower()):
            hasattr 判断是否有对应属性方法
            '''
            handle = getattr(self,request.method.lower())
            return handle(request,*args,**kwargs)

        return view

    def get(self, request, *args, **kwargs):
        
        return HttpResponse("hello get")

    def post(self, request, *args, **kwargs):
        
        return HttpResponse("hello post")

    def put(self, request, *args, **kwargs):
        
        return HttpResponse("hello put")

    def delete(self, request, *args, **kwargs):
        
        return HttpResponse("hello delete")
from django.urls import path,include
from django.conf.urls import url
from .views import Users
urlpatterns = [
    url(r'^hello/',Users.as_view()),
]

示例二: 限制请求(伪代码)

from django.http import HttpResponse

# Create your views here.


class Users(object):
    http_method_names = ["get","post","delete"]
    def as_view(self):
        def view(request, *args, **kwargs):
            
            if request.method.lower() in self.http_method_names:
                handle = getattr(self,request.method.lower())
            else:
                handle = self.http_method_not_allowed()
            
            return handle(request,*args,**kwargs)

        return view

    def http_method_not_allowed(self, request, *args, **kwargs):
        pass
    
    def get(self, request, *args, **kwargs):
        
        return HttpResponse("hello get")

    def post(self, request, *args, **kwargs):
        
        return HttpResponse("hello post")

    def put(self, request, *args, **kwargs):
        
        return HttpResponse("hello put")

    def delete(self, request, *args, **kwargs):
        
        return HttpResponse("hello delete")

示例三:数据和请求分离,dispatch(伪代码)

from django.http import HttpResponse

# Create your views here.


class Users(object):
    http_method_names = ["get", "post", "delete"]

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

    def dispatch(self, request, *args, **kwargs):
        if request.method.lower() in self.http_method_names:
            handle = getattr(self, request.method.lower())
        else:
            handle = self.http_method_not_allowed()

        return handle(request, *args, **kwargs)

    def http_method_not_allowed(self, request, *args, **kwargs):
        pass

    def get(self, request, *args, **kwargs):

        return HttpResponse("hello get")

    def post(self, request, *args, **kwargs):

        return HttpResponse("hello post")

    def put(self, request, *args, **kwargs):

        return HttpResponse("hello put")

    def delete(self, request, *args, **kwargs):

        return HttpResponse("hello delete")

实际使用

使用 View

from django.views import View
class MyView(View):
    def get(self,request,*args,**Kwargs):
        return HttpResponse("hello get")
from .views import MyView
urlpatterns = [
    url(r'^hello/',MyView.as_view()),
]

在这里插入图片描述

可以通过查看View类 源码的实现方式

类视图登录验证

了解下,不会用这种方式。以后用其他方式

from django.contrib.auth.decorators import login_required
from django.utils.decorators import method_decorator
class FooView(View):
    @method_decorator(login_required)
    def get(request,*args,**kwargs):
        return HttpResponse("hello world")
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

数哥

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值