diango中的MTV——FBV/CBV以及装饰器的复用问题解决
MVC
M: model 模型 与数据库交互
V: view 视图 HTML
C:controller 控制器 流程 和 业务逻辑
MTV
M:model ORM
T:template 模板 HTML
V:view 视图 业务逻辑
Django中的视图
FBV
def add_publisher(request,*args,**kwargs):
# 逻辑
return response
urls.py
url(r'^add_publisher',add_publisher )
CBV
from django.views import View
class Addpublisher(View):
def get(self,reuqest,*args,**kwargs)
# 处理GET请求的逻辑
self.request
return response
def post(self,reuqest,*args,**kwargs)
# 处理POST请求的逻辑
return response
urls.py
url(r'^add_publisher',Addpublisher.as_view() )
CBV中不同的请求能找到相应函数执行的原因:
继承了View,程序加载的时候,执行View中的Addpublisher.as_view(),
Addpublisher.as_view()定义了一个view函数,返回view,通过反射获取请求方式对应的方法(get/post)。
as_view的流程:
1. 程序加载的时候,执行Addpublisher.as_view():
定义了一个view函数,返回view
url(r'^add_publisher',view )
2. 请求到来时,执行view函数:
1. 实例化对象 ——》 self
2. self.request = request
3. 执行self.dispatch(request, *args, **kwargs)
1. 判断请求方式是否被允许:
1. 允许: 通过反射获取请求方式对应的方法(get/post) ——》 handler
2. 不允许:self.http_method_not_allowed ——》 handler
2. 执行handler,将它的结果返回
加装饰器
FBV
FBV 直接加
@login_required
def publisher(request):
CBV
解决装饰器加同时加在类和函数上时的参数导致的复用性问题:
不加method_decorator,加在类方法上,需要第一个参数需要是self,如果在login_required的inner括号里加上了self,函数便无法用这个装饰器了,所以装饰器加在类上时要借助method_decorator
from django.utils.decorators import method_decorator
登录验证的装饰器
def login_required(func):
def inner(request, *args, **kwargs):
# print(request.COOKIES)
# is_login = request.COOKIES.get('is_login')
# is_login = request.get_signed_cookie('is_login', salt='xxxx', default='')
is_login = request.session.get('is_login')
# print(request.path_info)
# print(request.get_full_path())
print(request.META.get('HTTP_ACCEPT'))
print(is_login)
if is_login != 1:
# 没有登录 跳转到登录页面
url = request.path_info
return redirect('/login/?url={}'.format(url))
ret = func(request, *args, **kwargs)
return ret
# if is_login == '1':
# # 登录
# ret = func(request, *args, **kwargs)
# return ret
# else:
# url = request.path_info
# return redirect('/login/?url={}'.format(url))
return inner
# 加在方法上
@method_decorator(login_required)
def get(self, request, *args, **kwargs):
# 重写dispatch方法,加在dispatch方法上
@method_decorator(login_required)
def dispatch(self, request, *args, **kwargs):
ret = super().dispatch(request, *args, **kwargs)
return ret
#直接找到父类的dispatch方法加上去 ——最简单!推荐!
@method_decorator(login_required,name='dispatch')
class Addpublisher(View)
# 加在类上
@method_decorator(login_required,name='post')
@method_decorator(login_required,name='get')
class Addpublisher(View)
diango中的MTV——FBV/CBV以及装饰器的复用问题解决的更多相关文章
- Django之Cookie Session详解,CBV,FBV登陆验证装饰器和自定义分页
Cookie Session和自定义分页 cookie Cookie的由来 大家都知道HTTP协议是无状态的. 无状态的意思是每次请求都是独立的,它的执行情况和结果与前面的请求和之后的请求都无直接 ...
- CBV加装饰器解决登录注册问题和 <<中间件>>
文本目录 CBV加装饰器解决登录注册问题 一:什么是中间件 二:中间件有什么用 三:自定义中间件 四:中间件应用场景 五:SCRF TOKEN跨站请求伪造 六: 其他操作 CBV加装饰器解决登录注册问 ...
- Django CBV加装饰器、Django中间件、auth模块
一. CBV加装饰器 在视图层中,基于函数的视图叫FBV(function base views),基于类的视图叫CBV(class base views).当需要用到装饰器时,例如之前的基于Cook ...
- django CBV 及其装饰器
#urls.py from django.contrib import admin from django.urls import path, re_path from app01 import vi ...
- Cookie与Session、CBV添加装饰器
cookie Cookie的由来 大家都知道HTTP协议是无状态的. 无状态的意思是每次请求都是独立的,它的执行情况和结果与前面的请求和之后的请求都无直接关系,它不会受前面的请求响应情况直接影响,也不 ...
- python is、==区别;with;gil;python中tuple和list的区别;Python 中的迭代器、生成器、装饰器
1. is 比较的是两个实例对象是不是完全相同,它们是不是同一个对象,占用的内存地址是否相同 == 比较的是两个对象的内容是否相等 2. with语句时用于对try except finally 的优 ...
- 13、python中的函数(闭包与装饰器)
一.嵌套函数 函数的内部又再定义另一个函数,这个函数就叫嵌套函数,里面含函数就叫内部函数. 示例: 二.返回函数 函数可以接收函数对象作为参数,同理函数也能返回一个函数对象作为返回值. 示例: 返回函 ...
- django的FBV和CBV的装饰器例子
备忘 def auth(func): def inner(request,*args,**kwargs): u = request.COOKIES.get('username111') if not ...
- CBV和FBV用户认证装饰器
FBV装饰器用户验证 CBV装饰器用户验证 装饰器位置 或 或
随机推荐
- dubbo 订阅 RPC 服务
Dubbo 订阅 RPC 服务 建立消费者者项目 pom.xml <?xml version="1.0" encoding="UTF-8"?> &l ...
- kettle教程---kettle作业调度,附件(excel)配置表名,一个调度完成所有的表操作
在平时工作当中,会遇到这种情况:复制一个库,几百甚至上千张表,并且无法设置dblink,此时通过kettle可以快速完成该任务. 按照正常的调度,有几百张表,咱们就要写几百个转换去处理,很不科学,下面 ...
- 2017 ACM/ICPC 沈阳 K题 Rabbits
Here N (N ≥ 3) rabbits are playing by the river. They are playing on a number line, each occupying a ...
- ceph 网络配置
ceph 网络配置 9. 分离 public network 和 cluster network 9.1 分离的好处 (1)提高性能:消除副本创建.数据恢复和再平衡对 public network 的 ...
- Appium之WebView自动化
WebView的测试:主要作用在混合(Hybrid)的应用 * 一部分是原生界面和代码,而另一部分是内嵌网页 * 比如微信.支付宝 * 内嵌了一个浏览器内核,由浏览器内核实现的 安卓应用中的内嵌的展示 ...
- 【Maven】plugin使用学习
Maven plugin使用学习 官网可用的插件:http://maven.apache.org/plugins/index.html 目录 ============================= ...
- Brett Beauregard大神的Arduino PID算法
大神的全部PID http://brettbeauregard.com/blog/category/pid/ Improving the Beginner’s PID – Introduction I ...
- 《Dotnet9》系列-开源C# Winform控件库强力推荐
时间如流水,只能流去不流回! 点赞再看,养成习惯,这是您给我创作的动力! 本文 Dotnet9 https://dotnet9.com 已收录,站长乐于分享dotnet相关技术,比如Winform.W ...
- Nginx代理缓存功能
Nginx代理缓存功能 Nginx缓存主要是用于减轻后端服务器的负载,提高网站并发量,提升用户体验度. 注意:Nginx反向代理的缓存功能是由ngx_http_proxy_module提供, ...
- github pages 子域名 ( subdomain ) https 认证
目录 说明 github pages 上的创建子域名 https 认证 说明 转载请注明出处https://www.cnblogs.com/bllovetx/p/12013462.html 欢迎访问我 ...