python - as_view()(对于基于类的 View )可以在装饰器中实现吗?

标签 python django django-views decorator

Django 的基于类 View 的 as_view() 语法一直困扰着我。基本上,我厌倦了必须为每个我想使用的基于类的 View 执行 my_view = MyView.as_view() (或者将 as_view() 放在我使用基于 c 的 View 的每个 url conf 的每一行中)。我认为类装饰器将是实现此目的的一种更简洁的方法,并且我正在尝试找出如何实现这一点,对于我自己的代码并在 django 片段上共享,以防其他人感兴趣。所以我的问题是:是否有一种合理的方法来实现“as_view”装饰器,以便以下代码可以正常工作?

@as_view(my_view)
class MyView(View):
   pass

这基本上相当于:

class MyView(View):
   pass
my_view = MyView.as_view()

谢谢,这也帮助我学习了python的高级功能(即装饰器)。

最佳答案

想到的一种方法是让类装饰器只是setattr某个对象,该对象将包含您想要定义的所有as_views。然后你可以在你的 urls.py 中使用它

import re

class Views(object):
    """Empty object for holding as_view method"""
views = Views()

def convert_name(name):
    """convert CapWords into cap_words"""
    return name[0].lower() + re.sub(r'([A-Z])', lambda m:"_" + m.group(0).lower(), name[1:])

def as_view(views):
    """Adds decorated class-based views' as_view methods to views container"""
    def decorator(cls):
        name = convert_name(cls.__name__)
        setattr(views, name, cls.as_view)
        return cls
    return decorator

然后在你的views.py中你可以像这样使用它:

from as_view_decorator import views, as_view

@as_view(views)
class MyView(View):
    ....

..和 MyView.as_view 将作为 views.my_view 存储在 views 对象上。

你也可以在你的views.py中做这样的事情:

from as_view_decorator impor as_view
import sys; mod = sys.modules[__name__]

@as_view(mod)
class MyView(View):
    ...

这会将 my_view 设置为 views 模块上的属性。然后你可以在你的urls.py中:

from app.views import my_view

urlpatterns = patterns('',    
    url(r'^$', my_view()),
)

我认为 my_view = MyView.as_view 非常简单且可读,所以坦率地说,我自己更喜欢这样做。

关于python - as_view()(对于基于类的 View )可以在装饰器中实现吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7086272/

相关文章:

python - 在 Django 模板中创建排序选项

javascript - 无法从 selenium execute_script 访问 chrome 消息传递 API

python - 如何在scrapy上手动抛出503错误?

python - django s3 boto文件上传TypeError : invalid file: <InMemoryUploadedFile:

python - 如何检查某个键是否在 django 模板的字典中?

Django:如何将 2 天添加到用户输入的现有日期

python - 在另一个函数中引用变量?

python - 关于使用pygame和Python时释放内存

python - 无法将页面从主页转移到关于页面

django - 在 Django 测试客户端中访问 raw_post_data