cbv源码分析

# CBV基于类的视图。

定义一个类,加上路由。。
class Mylogin(View):
    # 类里面的方法名不能随便写,目前只能写post和get
    def get(self, request):  # 同时类里面的方法也要加上request
        print('get')
        return HttpResponse("get")

    # CBV中的路由选择是通过请求方式的不同来选择的,其路由文件中的路由地址不变
    # 可以通过form表单来发送post请求
    def post(self, request):
        print('post')
        return HttpResponse('post')





# CBV的源码分析
"""
1.在路由信息中,url('^qq/',views.Mylogin.as_view()),
首先Mylgin类会先在@classonlymethod装饰的作用下,会调用该方法,并传递给第一个即cls形参
2.在as_view方法中,有一个自定义函数view,并最后返回该函数,所以会相当于path('login/', View.view)
3.开始匹配路由,调用该函数
4.执行view()里面的方法,

        def view(request, *args, **kwargs):
            # self = MyLogin(**initkwargs)#此时cls相当于Mykogin,类名加括号后实例化,得到了一个对象
            self = cls(**initkwargs)
  
                self: MyLogin()即MyLogin()对象

            return self.dispatch(request, *args, **kwargs) # 这句话是最重要的

4.return  后面用 self.dispatch来用对象调用方法,
在对象中找不到这个方法,再去产生这个对象的类中去寻找即MyLogin(),MyLogin()中找不到再去其继承的父类即View中去寻找
5.在View中找到dispatch方法
    def dispatch(self, request, *args, **kwargs):
#getttr反射:通过字符串,动态的操作对象的属性或方法
        if request.method.lower() in self.http_method_names:
            handler = getattr(self, request.method.lower(), self.http_method_not_allowed)
        else:
            handler = self.http_method_not_allowed
        return handler(request, *args, **kwargs)
        
6.dispatch方法中 先判断请求方式的方法是否在self.http_method_names中,MyLogin()中找不到再去其继承的父类即View中去寻找该列表
http_method_names = ['get', 'post', 'put', 'patch', 'delete', 'head', 'options', 'trace']
若所定义的方法在这个里面则会执行getattr反射方法,找到该方法的属性,即找到get或者post方法,或者是自定义的方法,最后return加()


若不在这个里面则执行http_method_not_allowed()方法,
    def http_method_not_allowed(self, request, *args, **kwargs):
        logger.warning(
            'Method Not Allowed (%s): %s', request.method, request.path,
            extra={'status_code': 405, 'request': request}
        )
        return http.HttpResponseNotAllowed(self._allowed_methods())
从该方法中可以看出若在Mylogin类中定义的方法不在这个列表中,则会执行该方法,首先会有一个警告日志,显示所自定义的方法名和路径名
再抛出一个405页面
"""
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值