FBV(function base views)就是在 url 中一个路径对应一个函数html
urls.pypython
urlpatterns = [ url(r'^admin/', admin.site.urls), url(r'^index/', views.index) ]
views.pydjango
def index(request): return render(request, 'index.html')
CBV(class base views) 就是在视图里使用类处理请求,它是基于反射实现,根据请求的方式不一样,去执行不一样的方法json
流程:路由 --- View函数 --- dispatch执行反射cookie
urls.pysession
urlpatterns = [ url(r'^admin/', admin.site.urls), url(r'^students/', views.StudentsView.as_view()), ]
views.pyapp
from django.views import View class StudentsView(View): def dispatch(self, request, *args, **kwargs): ret = super(StudentsView, self).dispatch(request, *args, **kwargs) return ret def get(self, *args, **kwargs): return HttpResponse('GET') def post(self, *args, **kwargs): return HttpResponse('POST') def put(self, *args, **kwargs): return HttpResponse('PUT') def delete(self, *args, **kwargs): return HttpResponse('DELETE')
请求进来,先执行这个 dispatch()
,而后调用父类 View
的 dispatch()
函数
# View 的 dispatch() def dispatch(self, request, *args, **kwargs): # Try to dispatch to the right method; if a method doesn't exist, # defer to the error handler. Also defer to the error handler if the # request method isn't on the approved list. 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)
第一个参数 self
是 StudentsView
的对象,而后执行 getattr
,返回 handler(request, *args, **kwargs)
,至关于找到了 StudentsView
写的 get
方法,执行返回结果 HttpResponse('GET')
,将这个结果交给 ret
, ret
再返回给用户,因此看到的就是 GET
post
MIDDLEWARE = [ 'django.middleware.security.SecurityMiddleware', 'django.contrib.sessions.middleware.SessionMiddleware', 'django.middleware.common.CommonMiddleware', 'django.middleware.csrf.CsrfViewMiddleware', # 全站使用 csrf 认证 'django.contrib.auth.middleware.AuthenticationMiddleware', 'django.contrib.messages.middleware.MessageMiddleware', 'django.middleware.clickjacking.XFrameOptionsMiddleware', ]
from django.views.decorators.csrf import csrf_exempt @csrf_exempt # 该函数无需认证 def users(request): user_list = ['alex', 'oldboy'] return HttpResponse(json.dumps(user_list))
MIDDLEWARE = [ 'django.middleware.security.SecurityMiddleware', 'django.contrib.sessions.middleware.SessionMiddleware', 'django.middleware.common.CommonMiddleware', # 'django.middleware.csrf.CsrfViewMiddleware', # 全站不使用 csrf 认证 'django.contrib.auth.middleware.AuthenticationMiddleware', 'django.contrib.messages.middleware.MessageMiddleware', 'django.middleware.clickjacking.XFrameOptionsMiddleware', ]
from django.views.decorators.csrf import csrf_protect @csrf_protect # 该函数须要认证 def users(request): user_list = ['alex', 'oldboy'] return HttpResponse(json.dumps(user_list))
没法给单独的函数添加装饰器,必须加到 dispatch() 上,或者在类上加装饰器url
MIDDLEWARE = [ 'django.middleware.security.SecurityMiddleware', 'django.contrib.sessions.middleware.SessionMiddleware', 'django.middleware.common.CommonMiddleware', 'django.middleware.csrf.CsrfViewMiddleware', # 全站使用 csrf 认证 'django.contrib.auth.middleware.AuthenticationMiddleware', 'django.contrib.messages.middleware.MessageMiddleware', 'django.middleware.clickjacking.XFrameOptionsMiddleware', ]
from django.shortcuts import HttpResponse from django.views import View from django.utils.decorators import method_decorator class StudentsView(View): @method_decorator(csrf_exempt) def dispatch(self, request, *args, **kwargs): ret = super(StudentsView, self).dispatch(request, *args, **kwargs) return ret def get(self, *args, **kwargs): return HttpResponse('GET') def post(self, *args, **kwargs): return HttpResponse('POST') def put(self, *args, **kwargs): return HttpResponse('PUT') def delete(self, *args, **kwargs): return HttpResponse('DELETE')
from django.shortcuts import HttpResponse from django.views import View from django.utils.decorators import method_decorator @method_decorator(csrf_exempt, name='dispatch') # name表示只给dispatch加装饰器 class StudentsView(View): def get(self, *args, **kwargs): return HttpResponse('GET') def post(self, *args, **kwargs): return HttpResponse('POST') def put(self, *args, **kwargs): return HttpResponse('PUT') def delete(self, *args, **kwargs): return HttpResponse('DELETE')
View
as_view()
dispatch
这个函数反射执行,若是想要在执行 get
或 post
方法前执行其余步骤,能够重写 dispatch
from django.utils.decorators import method_decorator
@method_decorator()
,括号里面为装饰器的函数名name
csrf-token
装饰器的特殊性,它只能加在 dispatch
上面