django 视图层

django 视图层

  视图层所对应的py文件是views.py,它的作用是存放视图函数,写逻辑代码的地方。

FBV、CBV

1、FBV

  基于函数的视图

def index(request):
    return HttpResponse("it's index.")

 

2、FBV路由配置

from django.conf.urls import url
from app01 import views


urlpatterns = [
    url(r'^index/', views.index),
]

 

3、CBV

  基于类的视图

from django.views import View  # 必须导入View类

# 简单的CBV class MyLogin(View): def get(self, request): return render(request, 'login.html') def post(self, request): return HttpResponse('我是类里面的post')

 

4、CBV路由配置

from django.conf.urls import url
from app01 import views


urlpatterns = [
    url(r'^login/', views.MyLogin.as_view()),
]

  朝login提交get请求会自动执行MyLogin中的get方法,而提交post请求会自动执行MyLogin中的get方法。为什么MyLogin针对不同的请求方法能够自动执行对应的方法?

  那么就要去研究as_view()的源码。

 

5、CBV继承View类中的as_view方法源码分析

猜想:as_view要么是类中定义的普通函数 @staticmethod

  要么是类中定义的绑定给类的方法 @classmethod

 

结论:看源码发现是类方法 @classonlymethod 也就是 @classmethod

  通过CBV源码的第四步可以看出,根据网页的请求方式不同,dispatch函数通过请求方式名映射到MyLogin类中的方法并自动执行。View类中定义的默认请求方式为8种,如果请求方式的方式不在这八种请求方式中,即报错。

  因此,我们可以得出结论:CBV源码第四步中dispatch方法可以根据我们的需求重写dispatch方法。

class MyLogin(View):
    def dispatch(self, request, *args, **kwargs):
        '''
        重写dispatch代码的代码块
        '''
        pass

    def get(self, request):
        return render(request, 'login.html')

    def post(self, request):
        return HttpResponse('我是类里面的post')

 

6、补充:django settings源码 

  django暴露给用户一个可以自定义的配置,但是内部也有一个默认的配置。

  用户配置就用用户的,没有配置就用默认的。

  可以研究一下,面试加分项。

posted @ 2020-12-07 16:24  chchcharlie、  阅读(63)  评论(0编辑  收藏  举报