使用Django视图的类,它是Pythonic吗?

时间:2010-01-15 12:03:00

标签: python django

我目前正在学习Python并且来自强大的C#背景。我一直听到以Pythonic的方式做事情,以利用语言的动态性,我得到的一些,有些我不做。

我正在使用Django创建一个站点,我的视图方法是使用类。我目前的想法是有一个基类,它有一些关于模板和要使用的模型的东西。这将有一个默认的funky 404类型页面,其中包含站点搜索和其他内容,然后将所有其他页面基于此。因此,该站点的每个区域都将拥有自己的EG新闻,并且所有与模型相关的函数和过滤都将在该类中,并在HTML或AJAX请求的基础上进一步提供类。所以你会有这样的事情:

\站点\共同\ ViewBase

- \新闻\ NewsBase(ViewBase)

- \新闻\ HtmlView(NewsBase)

- \新闻\ AJAXView(NewsBase)

网址会像http://tld/news/latest地图一样映射到site.news.htmlview,而http://tld/news/ / to /也会映射到site.news.htmlview但该类会弄清楚如何处理额外的参数。

这几乎就是我在C#中所做的,但是Django教程只显示了使用视图的方法,让我想知道这不是一个非常pythonic的解决方案吗?

思想?

编辑:在S.Lott关于线程安全的评论之后,是不是更好地保留这些函数并让它们创建一个类的实例并在其上调用一个方法?

我正在寻找的是为网站的每个部分放置公共代码以过滤模型,网站身份验证等的地方

4 个答案:

答案 0 :(得分:4)

当然,如果您将URL路由到类的实际实例而不仅仅是一个类,那么将类用于视图没有任何问题。

答案 1 :(得分:2)

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

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

有人建议将所有现有的通用视图移到类中,它应该进入1.2但未能满足截止日期。

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

答案 2 :(得分:0)

抛开其他问题(例如线程安全问题),感觉这里有一个真正可能的危险,即跨越模型/视图/模板之间的亮线。

或者它可能感觉像是网址调度的替代品(not that there's anything wrong with that :-)。我不确定,但感觉有点 off

答案 3 :(得分:0)

虽然基于类的视图很有用,但继承可能不是这项特定工作的正确工具。辅助函数和装饰器是从视图中分解公共代码的两种很好的方法。对于可能在您的代码上工作的其他(python)编码人员,他们也往往更熟悉/更自然。

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

P.S。寻求pythonic解决方案的荣誉。