为Django视图使用类,是Pythonic吗?

为Django视图使用类,是Pythonic吗?,python,django,Python,Django,我目前正在学习Python,有很强的C#背景。我一直听说用一种类似于蟒蛇的方式来利用语言的动态特性,有些是我得到的,有些是我得不到的 我正在用Django创建一个站点,我的视图方法是使用类。我目前的想法是创建一个基类,其中包含一些关于模板和模型的内容。这将有一个默认的Funky404类型的页面,其中包含站点搜索和其他内容,然后所有其他页面都基于此。因此,该站点的每个区域都有自己的EG新闻,所有与模型相关的功能和过滤都将在该类中,在该类之上还有一个用于HTML或AJAX请求的类。所以你会有这样的想

我目前正在学习Python,有很强的C#背景。我一直听说用一种类似于蟒蛇的方式来利用语言的动态特性,有些是我得到的,有些是我得不到的

我正在用Django创建一个站点,我的视图方法是使用类。我目前的想法是创建一个基类,其中包含一些关于模板和模型的内容。这将有一个默认的Funky404类型的页面,其中包含站点搜索和其他内容,然后所有其他页面都基于此。因此,该站点的每个区域都有自己的EG新闻,所有与模型相关的功能和过滤都将在该类中,在该类之上还有一个用于HTML或AJAX请求的类。所以你会有这样的想法:

\站点\公共\视图库

--\新闻\新闻库(ViewBase)

--\新闻\HtmlView(新闻库)

--\新闻\AJAXView(新闻库)

URL将像映射到site.news.htmlview和/到/一样映射到site.news.htmlview,但类将确定如何处理额外的参数

这与我在C#中所做的差不多,但Django教程只显示了如何使用视图方法,这让我想知道这是否是一个非常pythonic的解决方案

想法

编辑:在S.Lott对线程安全性发表评论之后,是否最好让函数保持原样,让它们创建一个类的实例并对其调用一个方法


我要找的是一个地方,为站点的每个部分放置通用代码,用于过滤模型、站点身份验证等,如果您将URL路由到一个类的实际实例,而不仅仅是直接路由到一个类。

Django管理员正是这样做的-请查看Django/contrib/admin中的源代码

类的优点是它们更易于自定义,例如,您可以添加钩子以进行权限检查

有人提议将所有现有的泛型视图转移到类中,它本应进入1.2版,但未能在截止日期前完成


正如上面的海报所指出的,在处理实例变量时要非常小心——如果您查看admin类,您会看到请求被传递到各种方法,而不是依赖于“self”。

将其他问题(如线程安全问题)放在一边,在这里,跨越模型/视图/模板之间的亮线感觉可能存在真正的危险


或者它感觉像是url调度的替代品(:-)。我不确定,但感觉有点不对劲。

虽然基于类的视图很有用,但继承可能不是这个特定工作的合适工具。帮助器函数和装饰器是从视图中找出常见代码的两种很好的方法。对于可能处理您的代码的其他(python)程序员来说,它们也更为熟悉/自然

我不确定在您的情况下最好的方法是什么,因为我不知道您最终想要考虑多少,请记住,除了继承之外,python中还有其他考虑因素的方法


p、 寻找pythonic解决方案的美誉。

对对象中的实例变量要非常非常小心。Django可能是多线程的,唯一可以信任的线程安全变量是请求和局部变量。对象的实例变量应该被认为是线程不安全的。谢谢,我已经看过很多关于使类可调用的博客文章,所以对此感觉相当舒服:)可调用很容易。问题在于实例变量。如果不使用实例变量,就会产生这样一个问题:当您只使用
\uuuu调用\uuu
时,为什么要创建一个类?为什么不做一个函数?@S.Lott,一开始我和伊格纳西奥谈过,但你说得很好。我已经更新了这个问题,谢谢。在你的模型表上工作的代码应该放在管理器中,我不明白为什么它不是Pythonic。。。我想问题是它是否是Djangoic。