【发布时间】:2012-02-01 09:15:16
【问题描述】:
在 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 对象。
【问题讨论】:
-
你可以考虑开发一个中间件来拦截请求发布并获取数据,修改它们并将它们传递给底层函数。
-
@Jingo:我想过,但我并不总是想修改数据。此外,我希望能够指定视图中每个函数应针对哪些字段。 .....让我想起了那个模因家伙:“我并不总是修改数据,但当我这样做时,我会以最佳精度获得我的目标”:P