python - 装饰器在 Django 中覆盖 POST、GET 和 REQUEST - 做得对吗?

标签 python django decorator

在 Django 中,我创建了一个函数装饰器,在本示例中,它可以创建所提供的 POST/GET 参数的小写版本,并在 View 处理所有请求之前更新 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 对象。

最佳答案

如果您使用的是表单,则可以在表单本身中使用小写。

虽然实现在我看来有效,但我遇到一个问题,对于每个调用,您最终都会复制 get/post 字典,搜索它们,转换字段并将结果附加回 request._request 您需要了解它才能使用它。我觉得这有点过分了...

我会通过在 View 中调用一个简单的方法来更改它(根据您的情况,您可以用小写值覆盖原始值或创建新元素)。

另一种解决方案是通过 JavaScript 在 HTML 页面中执行此操作。您可以对模板进行(硬)编码,创建自定义小部件,或者使用小部件中指定的属性以及 jquery 调用之类的内容...

关于python - 装饰器在 Django 中覆盖 POST、GET 和 REQUEST - 做得对吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9093299/

相关文章:

python - 使用 Django 的 QuerySet 从 2 个不同的表中检索值

Django: "Error importing request processor module"使用自定义处理器

Python 用列表装饰属性 setter

python - 嵌套序列化器中的 Django Rest Framework 关系查询

python - 如何使用 gstreamer 预缓冲传入的网络流?

python - 按 pandas 中的日期字符串排序 - Python 2.7

python - VRML 到 X3D 转换

python - 为类中的所有函数捕获 "before/after function call"事件

c++ - 装饰者模式 vs. 调用 super 反模式

javascript - 如何按顺序获取所有元素文本