在Django中覆盖POST、GET和REQUEST的装饰器 - 正确方式?

1 投票
1 回答
1996 浏览
提问于 2025-04-17 12:06

在Django中,我创建了一个函数装饰器,这个装饰器可以把传入的POST或GET参数转换成小写,并在视图处理这些参数之前更新请求内容。

我为此创建了以下装饰器:

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 个回答

1

如果你在使用表单的话,可以直接在表单里把内容变成小写。

虽然这个方法在我看来是可行的,但我觉得有个问题就是每次调用的时候,你都要复制一遍获取到的数据字典,然后在里面查找、转换字段,最后再把结果放回request._request里。为了能用这个,你得知道这些细节。我觉得这样有点复杂了……

我会建议用一个简单的方法在视图里调用(根据你的情况,你可以选择用小写的值覆盖原来的值,或者创建新的元素)。

另一种解决办法是在HTML页面里通过javascript来处理。你可以直接写死模板,创建一个自定义的控件,或者使用像控件里指定的属性加上jquery的调用……

撰写回答