python django 自定义 装饰器
# -*-coding:utf-8-*-
__author__ = "GILANG (pleasurelong@foxmail.com)"
"""
django 自定义用于view的装饰器
"""
from functools import wraps def object_does_not_exist(func):
"""
不带参数的装饰器
"""
@wraps(func)
def returned_wrapper(request, *args, **kwargs):
try:
return func(request, *args, **kwargs)
except ObjectDoesNotExist:
raise Http404()
return returned_wrapper @object_does_not_exist
def detail(request):
"""
用法
"""
pass ############################################################################ def object_does_not_exist(redirect=None):
"""
第一种写法:带参数的装饰器
"""
def decorator(func):
@wraps(func)
def returned_wrapper(request, *args, **kwargs):
try:
return func(request, *args, **kwargs)
except ObjectDoesNotExist:
if redirect:
return HttpResponseRedirect(redirect)
else:
raise Http404()
return returned_wrapper
return decorator @object_does_not_exist(redirect='/')
def detail(request):
pass # 记得加个闭合括号,否则会出现类似 takes exactly 1 argument (0 given) 的错误
@object_does_not_exist()
def foo(request):
pass ############################################################################ def object_does_not_exist(func=None, redirect=None):
"""
第二种写法:带参数的装饰器
第二种方法可以解决 got an unexpected keyword argument 错误。
"""
def decorator(func):
@wraps(func)
def returned_wrapper(request, *args, **kwargs):
try:
return func(request, *args, **kwargs)
except ObjectDoesNotExist:
if redirect:
return HttpResponseRedirect(redirect)
else:
raise Http404()
return returned_wrapper if not func:
def foo(func):
return decorator(func)
return foo else:
return decorator(func) @object_does_not_exist(redirect='/')
def detail(request):
pass @object_does_not_exist
def foo(request):
pass
python django 自定义 装饰器的更多相关文章
- Django自定义装饰器
		
装饰器模板: def decorator(func): def wrapper(*args,**kwargs): return func(*args,**kwargs) return wrapper ...
 - Django学习笔记第八篇--实战练习四--为你的视图函数自定义装饰器
		
零.背景: 对于登录后面所有视图函数,都需要验证登录信息,一般而言就是验证cookie里面的一些信息.所以你可以这么写函数: def personinfo(request): ": retu ...
 - Day04 - Python 迭代器、装饰器、软件开发规范
		
1. 列表生成式 实现对列表中每个数值都加一 第一种,使用for循环,取列表中的值,值加一后,添加到一空列表中,并将新列表赋值给原列表 >>> a = [0, 1, 2, 3, 4, ...
 - 【Python】 闭包&装饰器
		
python中的函数本身就是对象,所以可以作为参数拿来传递.同时其允许函数的层级嵌套定义,使得灵活性大大增加. 闭包 闭包的定义:将函数的语句块与其运行所需要的环境打包到一起,得到的就是闭包对象.比如 ...
 - python 闭包和装饰器
		
python 闭包和装饰器 一.闭包闭包:外部函数FunOut()里面包含一个内部函数FunIn(),并且外部函数返回内部函数的对象FunIn,内部函数存在对外部函数的变量的引用.那么这个内部函数Fu ...
 - python设计模式之装饰器详解(三)
		
python的装饰器使用是python语言一个非常重要的部分,装饰器是程序设计模式中装饰模式的具体化,python提供了特殊的语法糖可以非常方便的实现装饰模式. 系列文章 python设计模式之单例模 ...
 - Python入门篇-装饰器
		
Python入门篇-装饰器 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.装饰器概述 装饰器(无参) 它是一个函数 函数作为它的形参 返回值也是一个函数 可以使用@functi ...
 - python高级之装饰器
		
python高级之装饰器 本节内容 高阶函数 嵌套函数及闭包 装饰器 装饰器带参数 装饰器的嵌套 functools.wraps模块 递归函数被装饰 1.高阶函数 高阶函数的定义: 满足下面两个条件之 ...
 - [python基础]关于装饰器
		
在面试的时候,被问到装饰器,在用的最多的时候就@classmethod ,@staticmethod,开口胡乱回答想这和C#的static public 关键字是不是一样的,等面试回来一看,哇,原来是 ...
 
随机推荐
- Broken line - SGU 124(判断点与多边形的关系)
			
题目大意:RT 分析:构造一条射线,如果穿越偶数条边,那么就在多边形外面,如果穿越奇数条边,那么就在多边形里面. 代码如下: ===================================== ...
 - a^b-b^a - SGU 112(高精度快速幂)
			
分析:直接上吧,建议不要使用模板,否则没啥意义了. 代码如下: ==================================================================== ...
 - DOM方法
			
DOM常用方法: 方法 描述 getElementById() 返回带有指定 ID 的元素. getElementsByTagName() 返回包含带有指定标签名称的所有元素的节点列表(集合/节点数组 ...
 - win8.1 无法安装 net framework3.5的解决办法
			
近期给重装系统时,发现Windows8.1无法安装.net framework 3.5,即使我离线下载了安装文件,还要求安装2.0和3.0....而且无法从Windows更新中获取,因此百度到以下方案 ...
 - 002-python书写规范--消去提示波浪线
			
强迫症患者面对PyCharm的波浪线是很难受的,针对如下代码去除PyCharm中的波浪线: # _*_coding:utf-8_*_ # /usr/bin/env python3 A_user = & ...
 - 初学scala2——case class
			
case class,样例类,有人也叫条件类. 例如: case class Person(name:String, age:Int) 好用之处: 1.新建类实例不用new Person(..),直接 ...
 - 索引查找(索引查找、分块查找) C语言实现
			
1.基本概念 索引查找又称分级查找. 索引存储的基本思想是:首先把一个集合或线性表(他们对应为主表)按照一定的函数关系或条件划分成若干个逻辑上的子表,为每个子表分别建立一个索引项,由所有 这些索引项构 ...
 - 实现html转Xml
			
最近在做一些网页信息采集的工作,说通俗点就是爬虫工具,要监控页面中某一部分内容是否发生变化.起初考虑用正则表达式去匹配网页源码,经过咨询有经验人士,推荐使用xpath去获取页面内容能获得更好的效率.但 ...
 - MFC——error LNK2005: "protected: static struct AFX_MSGMAP
			
好久没弄VC程序了,今天弄了下,还会用公司给的窗口重绘作为基类来实现,竟然报了这个错误. 找了一下是这里: 有个窗口重绘类是基类: class CBaseDlg : public CDialog 新建 ...
 - Linux之TCPIP内核参数优化
			
/proc/sys/net目录 所有的TCP/IP参数都位于/proc/sys/net目录下(请注意,对/proc/sys/net目录下内容的修改都是临时的,任何修改在系统重启后都会丢失),例如下面这 ...