在Django中覆盖POST、GET和REQUEST的装饰器 - 正确方式?
在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的调用……