Django处理HTTP 请求中装饰器的使用

在学习Django的过程中,看见通过装饰器对view进行装饰,使得view可以提前处理Etag,if-modify-since以及检测请求的类型

 

先谈谈检测请求的类型:

我们知道Django的view是不区分请求的方法的,也就是说对于一个相同的URL,无论你是get或是post,你都会进入到一个相同的处理逻辑中。

当然我们可以自己在view中检测request.method. 但是如果提取到一个公共的需求的角度,可以认为每一个view都需要检测对应的方法。

 

首先看下我们希望如何使用:

 

#app.view file

@check_method("['GET','HEAD']")
def handle_view(request,*para,**kw):
    // handle request

 

我们的handle_view 期望只处理GET和HEAD过来的请求

分析下我们的装饰器,这个装饰器需要接受列表参数表明期望的方法的,该装饰器装饰的函数需要能处理任意的参数

 

#decorate

def check_method(method_list):
    def _deco(func):
        @functools.wrap(func)
        def    __deco(request,*para,**kw):
            if request.method in method_list:
                return func(request,*para,**kw)
            else:
                return "method not allowed"
        return __deco
    return _deco

 

可以看出来使用定义好的装饰器会非常方便

 

对于期望在view之前提前处理Etag,if-modify-since 代码是类似的

 

posted @ 2015-04-01 15:29  zhupumpkin  阅读(698)  评论(0编辑  收藏  举报