as_view() 基于类的视图
属性:
http_method_names
方法:
as_view()
dispatch()
http_method_not_allowed()
原理讲解,伪代码
示例一: 伪代码
from django.http import HttpResponse
# Create your views here.
class Users(object):
def as_view(self):
def view(request, *args, **kwargs):
'''
if hasattr(self,request.method.lower()):
hasattr 判断是否有对应属性方法
'''
handle = getattr(self,request.method.lower())
return handle(request,*args,**kwargs)
return view
def get(self, request, *args, **kwargs):
return HttpResponse("hello get")
def post(self, request, *args, **kwargs):
return HttpResponse("hello post")
def put(self, request, *args, **kwargs):
return HttpResponse("hello put")
def delete(self, request, *args, **kwargs):
return HttpResponse("hello delete")
from django.urls import path,include
from django.conf.urls import url
from .views import Users
urlpatterns = [
url(r'^hello/',Users.as_view()),
]
示例二: 限制请求(伪代码)
from django.http import HttpResponse
# Create your views here.
class Users(object):
http_method_names = ["get","post","delete"]
def as_view(self):
def view(request, *args, **kwargs):
if request.method.lower() in self.http_method_names:
handle = getattr(self,request.method.lower())
else:
handle = self.http_method_not_allowed()
return handle(request,*args,**kwargs)
return view
def http_method_not_allowed(self, request, *args, **kwargs):
pass
def get(self, request, *args, **kwargs):
return HttpResponse("hello get")
def post(self, request, *args, **kwargs):
return HttpResponse("hello post")
def put(self, request, *args, **kwargs):
return HttpResponse("hello put")
def delete(self, request, *args, **kwargs):
return HttpResponse("hello delete")
示例三:数据和请求分离,dispatch(伪代码)
from django.http import HttpResponse
# Create your views here.
class Users(object):
http_method_names = ["get", "post", "delete"]
def as_view(self):
def view(request, *args, **kwargs):
self.request=request
self.args=args
self.kwargs=kwargs
return self.dispatch(request,*args,**kwargs)
return view
def dispatch(self, request, *args, **kwargs):
if request.method.lower() in self.http_method_names:
handle = getattr(self, request.method.lower())
else:
handle = self.http_method_not_allowed()
return handle(request, *args, **kwargs)
def http_method_not_allowed(self, request, *args, **kwargs):
pass
def get(self, request, *args, **kwargs):
return HttpResponse("hello get")
def post(self, request, *args, **kwargs):
return HttpResponse("hello post")
def put(self, request, *args, **kwargs):
return HttpResponse("hello put")
def delete(self, request, *args, **kwargs):
return HttpResponse("hello delete")
实际使用
使用 View
from django.views import View
class MyView(View):
def get(self,request,*args,**Kwargs):
return HttpResponse("hello get")
from .views import MyView
urlpatterns = [
url(r'^hello/',MyView.as_view()),
]
可以通过查看View类 源码的实现方式
类视图登录验证
了解下,不会用这种方式。以后用其他方式
from django.contrib.auth.decorators import login_required
from django.utils.decorators import method_decorator
class FooView(View):
@method_decorator(login_required)
def get(request,*args,**kwargs):
return HttpResponse("hello world")