目录
FBV + CBV FBV(function bases views) FBV中加装饰器相关 CBV(class bases views) CBV中加装饰器相关FBV + CBV
django中请求处理方式有2种:FBV 和 CBV
FBV(function bases views)
就是在视图里使用函数处理请求,如下:
# urls.py
from django.conf.urls import url, include
from app01 import views
urlpatterns = [
url(r'^index/', views.index),
]
# views.py
from django.shortcuts import render
def index(req):
if req.method == 'POST':
print('method is :' + req.method)
elif req.method == 'GET':
print('method is :' + req.method)
return render(req, 'index.html')
注意此处定义的是函数【def index(req):】
<!--index.html-->
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>index</title>
</head>
<body>
<form action="" method="post">
<input type="text" name="A" />
<input type="submit" name="b" value="提交" />
</form>
</body>
</html>
FBV中加装饰器相关
def deco(func):
def wapper(request,*agrs,**kwargs):
if request.COOKIES.get('LOGIN'):
return func(request, *args, **kwargs)
return redirect('/login/')
return wrapper
@deco
def index(req):
if req.method == 'POST':
print('method is :' + req.method)
elif req.method == 'GET':
print('method is :' + req.method)
return render(req, 'index.html')
上面就是FBV的使用。
CBV(class bases views)
就是在视图里使用类处理请求,如下:
# urls.py
from app01 import views
urlpatterns = [
url(r'^index/', views.Index.as_view()),
]
# views.py
from django.views import View
# 类要继承View ,类中函数名必须小写
class Index(View):
def get(self, req):
'''
处理GET请求
'''
print('method is :' + req.method)
return render(req, 'index.html')
def post(self, req):
'''
处理POST请求
'''
print('method is :' + req.method)
return render(req, 'index.html')
CBV中加装饰器相关
要在CBV视图中使用我们上面的check_login装饰器,有以下三种方式:
加在CBV视图的get或post方法上
from django.utils.decorators import method_decorator
from django.views import View
class Index(View):
def dispatch(self,req,*args,**kwargs):
return super(Index,self).dispatch(req,*args,**kwargs)
def get(self, req):
print('method is :' + req.method)
return render(req, 'index.html')
@method_decorator(deco)
def post(self, req):
print('method is :' + req.method)
return render(req, 'index.html')
加在diapatch方法上,因为CBV中首先执行的就是dispatch方法,所以这么写相当于给get和post方法都加上了登录校验。
from django.utils.decorators import method_decorator
from django.views import View
class Index(View):
@method_decorator(deco)
def dispatch(self,req,*args,**kwargs):
return super(Index,self).dispatch(req,*args,**kwargs)
def get(self, req):
print('method is :' + req.method)
return render(req, 'index.html')
def post(self, req):
print('method is :' + req.method)
return render(req, 'index.html')
直接加在视图类上,但method_decorator必须传name关键字参数
如果get方法和post方法都需要登录校验的话就写两个装饰器
from django.utils.decorators import method_decorator
from django.views import View
@method_decorator(deco,name='get')
@method_decorator(deco,name='post')
class Index(View):
def dispatch(self,req,*args,**kwargs):
return super(Index,self).dispatch(req,*args,**kwargs)
def get(self, req):
print('method is :' + req.method)
return render(req, 'index.html')
def post(self, req):
print('method is :' + req.method)
return render(req, 'index.html')
查看更多关于Django--FBV + CBV的详细内容...
声明:本文来自网络,不代表【好得很程序员自学网】立场,转载请注明出处:http://haodehen.cn/did172813