Django中有两种方式来创建视图
第一种:FBV(fucntion base view)
FBV就是在url中一个路径对应一个函数
urlpatterns = [ url(r'^admin/', admin.site.urls), url(r'^index/', views.index) ]
在视图函数中
def index(request): if request.method == "GET": return render(request, 'index.html')
第二种:CBV(class base view)
继承自: django.views.View (继承了View后,通过as_view(),会首先执行View类中的dispatch, 所以我们可以重载dispatch来实现认证装饰器的效果)
CBV就是在url中一个路径对应一个类
urlpatterns = [ url(r'^admin/', admin.site.urls), url(r'^index/', views.IndexView.as_view()) # 执行类后面的as_view()方法,是父类里面的方法 ]
在视图类中
from django.views import View class IndexView(View): # 以get形式访问会执行get函数,一般情况下获取数据 def get(self, *args, **kwargs): return HttpResponse('666') # 以post形式访问的话会执行post函数,一般情况下发送数据 def post(self, *args, **kwargs): return HttpResponse('999')
CBV重新定义dispatch函数
所有的方法本质上都是通过dispatch这个函数反射执行,如果想要在执行get或post方法前执行其他步骤,可以重写dispatch
class User(View): http_method_names = ['get', 'post', 'put', 'patch', 'delete', 'head', 'options', 'trace'] def dispatch(self, request, *args, **kwargs): print("before") obj = super(User, self).dispatch(request, *args, **kwargs) print("after") return obj def get(self, request): print("get...") return HttpResponse("get......") def post(self, request): print("post...") return HttpResponse("post......")