zoukankan      html  css  js  c++  java
  • 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
    

      

  • 相关阅读:
    75.Java异常处理机制-自定义异常
    75.Java异常处理机制-手动抛出异常
    75.Java异常处理机制throws
    mybatis的xml文件中如何处理大小于号
    JS 拼装代码的HTML onClick方法传递字符串
    Java 日期往后推迟n天
    MySql 去重且指定某字段在前的排序方法
    java运行内存分配图(转)
    Java中正则Matcher类的matches()、lookAt()和find()的区别<转>
    图片在父元素中上下居中(vertical-align的有效性)
  • 原文地址:https://www.cnblogs.com/zhaojia-dream/p/4673779.html
Copyright © 2011-2022 走看看