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以及装饰器的复用问题解决的更多相关文章

  1. Django之Cookie Session详解,CBV,FBV登陆验证装饰器和自定义分页

    Cookie Session和自定义分页   cookie Cookie的由来 大家都知道HTTP协议是无状态的. 无状态的意思是每次请求都是独立的,它的执行情况和结果与前面的请求和之后的请求都无直接 ...

  2. CBV加装饰器解决登录注册问题和 <<中间件>>

    文本目录 CBV加装饰器解决登录注册问题 一:什么是中间件 二:中间件有什么用 三:自定义中间件 四:中间件应用场景 五:SCRF TOKEN跨站请求伪造 六: 其他操作 CBV加装饰器解决登录注册问 ...

  3. Django CBV加装饰器、Django中间件、auth模块

    一. CBV加装饰器 在视图层中,基于函数的视图叫FBV(function base views),基于类的视图叫CBV(class base views).当需要用到装饰器时,例如之前的基于Cook ...

  4. django CBV 及其装饰器

    #urls.py from django.contrib import admin from django.urls import path, re_path from app01 import vi ...

  5. Cookie与Session、CBV添加装饰器

    cookie Cookie的由来 大家都知道HTTP协议是无状态的. 无状态的意思是每次请求都是独立的,它的执行情况和结果与前面的请求和之后的请求都无直接关系,它不会受前面的请求响应情况直接影响,也不 ...

  6. python is、==区别;with;gil;python中tuple和list的区别;Python 中的迭代器、生成器、装饰器

    1. is 比较的是两个实例对象是不是完全相同,它们是不是同一个对象,占用的内存地址是否相同 == 比较的是两个对象的内容是否相等 2. with语句时用于对try except finally 的优 ...

  7. 13、python中的函数(闭包与装饰器)

    一.嵌套函数 函数的内部又再定义另一个函数,这个函数就叫嵌套函数,里面含函数就叫内部函数. 示例: 二.返回函数 函数可以接收函数对象作为参数,同理函数也能返回一个函数对象作为返回值. 示例: 返回函 ...

  8. django的FBV和CBV的装饰器例子

    备忘 def auth(func): def inner(request,*args,**kwargs): u = request.COOKIES.get('username111') if not ...

  9. CBV和FBV用户认证装饰器

    FBV装饰器用户验证 CBV装饰器用户验证 装饰器位置 或 或

随机推荐

  1. 回文自动机(PAM) 入门讲解

    处理回文串,Manacher算法也是很不错,但在有些问题的处理上比较麻烦,比如求本质不同的子串的数量还需要结合后缀数组才能解决.今天的们介绍一种能够方便的解决关于回文串的问题的算法--PAM. 一些功 ...

  2. Nginx学习一路向西

    Nginx 学习一路向北 Java大猿帅成长手册,GitHub JavaEgg ,N线互联网开发必备技能兵器谱 1. Nginx简介 1.1 Nginx 概述 NGINX是一个免费.开源.高性能.轻量 ...

  3. B树?这篇文章彻底看懂了!

    前言 索引,相信大多数人已经相当熟悉了,很多人都知道 MySQL 的索引主要以 B+ 树为主,但是要问到为什么用 B+ 树,恐怕很少有人能把前因后果讲述完整.本文就来从头到尾介绍下数据库的索引. 索引 ...

  4. QT使用mysql

    1.首先要下载qt create 官网链接:https://wiki.qt.io/Main 2.下载mysql驱动mysql-connector-c,注意是c或c++版本的驱动 官网下载地址:http ...

  5. [译]C# 7系列,Part 1: Value Tuples 值元组

    Mark Zhou写了很不错的一系列介绍C# 7的文章,虽然是2年多年前发布的,不过对于不熟悉C# 7特性的同学来说,仍然有很高的阅读价值. 原文:https://blogs.msdn.microso ...

  6. ASP.NET CORE 使用Consul实现服务治理与健康检查(1)——概念篇

    背景 笔者所在的公司正在进行微服务改造,这其中服务治理组件是必不可少的组件之一,在一番讨论之后,最终决定放弃 Zookeeper 而采用 Consul 作为服务治理框架基础组件.主要原因是 Consu ...

  7. Android BGradualProgress 多种渐变、直角or弧角、进度条、加载条

    可实现多种渐变.直角or弧角.进度条.加载条 (Various gradient, right or arc angle, progress bar and loading bar can be re ...

  8. Linux 版本控制工具之rabbitvcs

    原文地址:http://www.robotshell.com/2017/11/04/Linux-%E7%89%88%E6%9C%AC%E6%8E%A7%E5%88%B6%E5%B7%A5%E5%85% ...

  9. CodeForces - 5C(思维+括号匹配)

    题意 https://vjudge.net/problem/CodeForces-5C 给出一个括号序列,求出最长合法子串和它的数量. 合法的定义:这个序列中左右括号匹配. 思路 这个题和普通的括号匹 ...

  10. cpv framework 0.1 正式发布 (C++ 网页框架)

    项目地址 https://github.com/cpv-project/cpv-framework 项目介绍 cpv framework 是一个 C++ 编写的网页框架,基于 seastar fram ...