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暴露给用户一个可以自定义的配置,但是内部也有一个默认的配置。
用户配置就用用户的,没有配置就用默认的。
可以研究一下,面试加分项。