前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Django自定义用于Views的装饰器

Django自定义用于Views的装饰器

作者头像
一朵灼灼华
发布2022-08-05 20:23:27
3670
发布2022-08-05 20:23:27
举报

不带参数的装饰器

代码语言:javascript
复制
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  123456789101112131415161718

带参数的装饰器

  • 第一种方法
代码语言:javascript
复制
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  1234567891011121314151617181920212223
  • 第二种方法
代码语言:javascript
复制
def object_does_not_exist(func=None, 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  

    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
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2018-09-05,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 不带参数的装饰器
  • 带参数的装饰器
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档