我试图在Django中重构一个相当大的view函数。有太多的变量浮动,这是一个巨大的函数。在
理想情况下,我希望将视图模块化为逻辑函数。 但是,我必须传递函数上下文以方便访问变量。在
例如:
def complex_view(request, slug):
some complex logic which creates variable abc ...
...
some more complex logic which uses variable abc ...
...
etc.
应该变成:
^{pr2}$我可以想出一些方法来做到这一点,其中一些在本页中已经指出: http://mail.python.org/pipermail/tutor/2009-February/067506.html
a.主视图中定义的子功能。因为很难区分哪些变量是共享的,哪些是不共享的,所以这看起来很混乱
b.将locals()
作为字典传入。这也是一个混乱,因为现在有两种不同的访问变量的方法:xyz
和{N
中使用一个,在调用N+1
中使用下一个。在
c.强力将所有变量传递给每个函数调用并返回相关变量。当涉及到很多变量时,这会变得非常乏味。在
<强> D.<强> C++中,我只需创建一个类^ {< CD6>},定义所有共享变量,并创建成员函数来执行该工作。然后您可以对该类中的所有内容使用self.xyz
。
我想我也可以在Python中使用这个方法。但不确定这是不是最好的方法。在
在Python/Django中,您对首选的方法有什么看法?在
我喜欢(d)-为它创建一个类,并使用成员函数来完成这项工作。在
在Django中,视图只是一个“callable”,它接受HTTPRequest对象,以及URL路由传递给它的任何其他参数。在
Python类可以像函数一样被调用,如果您在Python类上定义一个
__call__
方法,如下所示:然后您可以在
urls.py
文件中命名该类,它将像任何其他python函数一样被调用。在执行此操作还可以将类似视图转换为对象实例:
^{pr2}$在网址.py,引用对象(而不是类)对象也可以像函数一样调用。在
其他技巧是使用继承来定义相似的视图,或者为基类中的许多类似视图提供一些通用功能,然后专门的视图类从这些视图类继承。在
您可以查看this slideshow by Simon Willison以获取更多详细信息,或查看{a2}以获取具体示例
我可以建议使用类似于d)的东西吗
通过这个过程,您甚至可以将类拆分为不同的文件(如果Django可以这样做,我没有经验)。在
相关问题 更多 >
编程相关推荐