装饰者在Django中覆盖POST,GET和REQUEST - 做得对吗?

时间:2012-02-01 09:15:16

标签: python django decorator

在Django中,我创建了一个函数装饰器,在这个例子中,它可以创建一个提供的POST / GET参数的小写版本,并在视图处理它之前更新REQUEST。 我为此创建了以下装饰器:

def force_lowercase(*fields):
    assert isinstance(fields, tuple), "Fields must be of type tuple."

    def wrap_func(fn):
       def wrapper(request):
           post = request.POST.copy()
           get  = request.GET.copy()
           for field in fields:
               if field in post:
                   post[field] = post[field].lower()
               if field in get:
                   get[field]  = get[field].lower()

           request._post = post   
           request._get = get
           request._request = MergeDict(post,get)

           return fn(request)
       return wrapper
   return wrap_func

在我看来,我会有类似的东西:

@force_lowercase(email,zipcode)
def index(request)
    #blabla

这是正确的方法吗?我有点担心我以这种方式破解Django的WSGIRequest对象,其他Django功能可能看不到更新的GET / POST / REQUEST对象。

1 个答案:

答案 0 :(得分:1)

如果您正在使用表单,则可以在表单中使用小写字母。

虽然IMO的实施工作正常,但我遇到的问题是,对于每一次调用,您最终都会复制获取/发布词典,搜索它们,转换字段并将结果追加回request._request您需要的内容知道能够使用它。我认为这有点过分了......

我会使用视图中调用的简单方法更改它(根据您的情况,您可以使用小写的方法覆盖原始值或创建新元素)。

另一个解决方案是通过javascript在HTML页面中完成。您可以(硬)编写模板代码,创建自定义窗口小部件,或使用窗口小部件中指定的属性加上jquery调用......