【问题标题】:Using classes for Django views, is it Pythonic?为 Django 视图使用类,是 Pythonic 吗?
【发布时间】:2010-01-15 12:03:00
【问题描述】:

我目前正在学习 Python,并且拥有强大的 C# 背景。我一直听说以 Python 式的方式做事,以利用语言的动态特性,其中一些我得到,一些我没有。

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

\site\common\ViewBase

--\news\NewsBase(ViewBase)

--\news\HtmlView(NewsBase)

--\news\AJAXView(NewsBase)

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

这几乎是我在 C# 中会做的事情,但 Django 教程只展示了使用视图方法,这让我想知道这是否不是一个非常 Pythonic 的解决方案?

想法?

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

我正在寻找的是一个放置网站每个部分的通用代码的地方,用于过滤模型、网站身份验证等

【问题讨论】:

标签: python django


【解决方案1】:

当然,将类用于视图并没有什么问题,只要您将 URL 路由到类的实际实例,而不仅仅是直接的类。

【讨论】:

  • 对对象中的实例变量要非常非常小心。 Django 可能是多线程的,唯一可以信任的线程安全变量是请求和本地变量。对象的实例变量应该被认为是线程安全的。
  • 谢谢,我已经看过很多关于使类可调用的博客文章,所以感觉很舒服:)
  • Callable 很简单。问题出在实例变量上。如果你不使用实例变量,它会导致一个问题,当你只使用__call__ 时为什么要创建一个类?为什么不做一个函数呢?
  • @S.Lott,我一开始是在和 Ignacio 交谈,但你说得很好。我已经更新了问题,谢谢。
【解决方案2】:

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

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

有一个提议将所有现有的通用视图转移到类中,它应该进入 1.2,但未能赶上最后期限。

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

【讨论】:

    【解决方案3】:

    撇开其他问题(例如线程安全问题)不谈,感觉这里确实存在跨越模型/视图/模板之间的明线的危险。

    或者感觉就像是 url 调度的替代品 (not that there's anything wrong with that :-)。我不确定,但感觉有点偏离

    【讨论】:

      【解决方案4】:

      虽然基于类的视图很有用,但继承可能不是此特定工作的正确工具。辅助函数和装饰器是从视图中提取通用代码的两种好方法。对于可能处理您的代码的其他 (python) 编码人员来说,它们也往往更熟悉/更自然。

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

      附言感谢您寻找 Pythonic 解决方案。

      【讨论】:

        猜你喜欢
        • 2011-07-14
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-12-27
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-05-29
        相关资源
        最近更新 更多