Django_CBV

2 篇文章 0 订阅
2 篇文章 0 订阅
CBV
简介:使用 Class 取代原来的 def 在django中做视图的处理。( FBV就是我们经常使用的用def处理视图函数)
需要提前导入
     from django import views
    from django.utils.decorators import method_decorator
dispath: 是view.View 中的一个分发器,主要功能是根据request.header.method的不同来选择不同的方法处理视图。
优点: 逻辑较为清晰
可以做到一次性对多个方法添加装饰器 (有分发器都可以)


一:project
----------------------------------------------urls
from item import views as item_views
urlpatterns = [
url( r'^item_login/$' ,item_views.Login.as_view()),
]
二:app<-item
----------------------------------------------views1
使用装饰器,对方法添加操作,每一个方法都需要添加一个装饰器
from django import views
from django.utils.decorators import method_decorator

def outer(child): # 将被路由器装饰的方法传入。名称为 child (可自己命名)执行步骤1
def process(request, *args, **kargs): # 获取参数 执行步骤2
print ( ' 先走这一步, 拿到传来的参数 ' ) 执行步骤3
return child(request, *args, **kargs) # 执行被装饰的方法 执行步骤4
return process 执行步骤5

'''
需要注意的是 步骤1虽然拿到了被装饰的方法,但是却没有做任何操作。
但也仅仅是拿到方法而已。
'''

class Login(views.View):
@method_decorator(outer) #装饰器的使用方法
def get( self , request, *args , **kwargs ):
print (request.method, 'ggggggg' )
obj = render(request, "item_login.html" , { "message" : '' })
return obj
@method_decorator(outer) #装饰器的使用方法
def post( self , request, *args , **kwargs ):
print (request.method)
username = request.POST.get( "user" )
password = request.POST.get( "pwd" )
user = item_models.Administrator.objects.filter( username = username, password = password).count()
print (user)
if user:
request.session[ 'is_log' ] = True
request.session[ 'username' ] = username
rep = redirect( "/item_index/" )
return rep
else :
message = ' 用户名或密码错误 '
obj = render(request, "item_login.html" , { "message" : message})
return obj

----------------------------------------------views2
使用 view.View(父类)中的dispatch(重写dispatch)方法替代装饰器
优点 与装饰器功能相同,而且只需要写一次
from django import views
from django.utils.decorators import method_decorator

class Login(views.View):
# @method_decorator(outer)
def dispatch( self , request, *args, **kwargs):
print ( ' 在执行 post get 之前进行操作,可以替代装饰器 ' )
rep = super (Login, self ).dispatch(request, *args, **kwargs) # 执行方法
print ( ' 在执行 post get 后进行操作 ' )
return rep # 返回

def get( self , request, *args , **kwargs ):
print (request.method, 'ggggggg' )
obj = render(request, "item_login.html" , { "message" : '' })
return obj

def post( self , request, *args , **kwargs ):
print (request.method)
username = request.POST.get( "user" )
password = request.POST.get( "pwd" )
user = item_models.Administrator.objects.filter( username = username, password = password).count()
print (user)
if user:
request.session[ 'is_log' ] = True
request.session[ 'username' ] = username
rep = redirect( "/item_index/" )
return rep
else :
message = ' 用户名或密码错误 '
obj = render(request, "item_login.html" , { "message" : message})
return obj

----------------------------------------------views3
现在的需求是,我在执行post 或者get 或者其他方法请求时需要验证是否登录。
方法一: 使用dispatch 参考views2
方法二:使用路由 参考views1
方法三:dispatch + 路由
写法1:
class Login(views.View):
@method_decorator (outer)
def dispatch( self , request, *args, **kwargs):
rep = super (Login, self ).dispatch(request, *args, **kwargs) # 执行方法
return rep # 返回
写法2:
@method_decorator (outer,name=dispatch)
class Login(views.View):
def dispatch( self , request, *args, **kwargs):
rep = super (Login, self ).dispatch(request, *args, **kwargs) # 执行方法
return rep # 返回


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值