【问题标题】:Where should utility functions live in Django?实用程序函数在 Django 中应该放在哪里?
【发布时间】:2011-03-18 17:44:35
【问题描述】:

实用程序函数在 Django 中应该放在哪里?自定义加密/解密数字、发送推文、发送电子邮件、验证对象所有权、自定义输入验证等功能。我在应用程序的许多地方使用的重复和自定义内容。我现在肯定要打破 DRY 了。

我看到了一些在 models.py 中定义函数的演示,尽管这在我看来在概念上并不正确。他们应该进入导入到我的项目中的“实用程序”应用程序吗?如果是这样,它们在实用程序应用程序中的位置是什么?那里的models.py文件?

感谢您帮助这个 n00b。

更新:让我说得更具体一些。假设我需要一个函数“light_encrypt(number)”,它接受参数“number”,将其乘以 7,加 10 并返回结果,另一个函数“light_decrypt(encr_number)”接受参数“encr_number”,减去 10,除以 7 并返回结果。我会将它放在我的 Django 树的什么位置?这不是中间件,对吗?正如 Felix 建议的那样,我是否创建一个 python 包并将其导入到我需要这些函数的视图中?

【问题讨论】:

标签: python django structure


【解决方案1】:

这是另一种方法:

如果实用功能可以是一个独立的模块 并且您正在为您的 django 应用程序使用 virtualenv 环境 然后您可以将功能捆绑为一个包并将其安装在您的 virtualenv 中。

这使得在您的 django 应用中您需要的任何地方都可以轻松导入。

【讨论】:

  • 如果你展示了如何制作一个简单的包会很好
【解决方案2】:

好的,在阅读了 cmets 并在此处回答之后,我决定在我的项目目录中创建一个名为“common/util/”的目录。在其中我有一个文件“__ init__.py”,其中有我的小助手函数。

我猜如果文件太大,我会将函数拆分为单独的 .py 文件。所以现在,我的项目结构是这样的。如果我做出任何错误的选择,请更正,我在开发中已经足够早了,我现在可以修复它,而它仍然很容易修复!

myproject/         (Django project) 
  common/  
    util/
      __init__.py  (helper functions)  
  middleware/      (custom middleware)  
  templates/       (project templates)  
  myapp/
    fixtures/      (initial data to load)
    migrations/    (south migrations)
    urls/
    views/
    admin.py
    forms.py
    models.py
    test.py

 public/           (static stuff not served by Django)
   media/
     css/
     img/
     js/
     lib/

【讨论】:

  • FWIW,我在 django-profiles 应用程序中看到 ubernostrum 在与 urls.py 和 views.py 相同的目录中创建了一个 utils.py 文件来保存他的实用程序函数
  • 当我在这里的时候。不要忘记 python 中的常见习语将您想要在模块级别的东西导入到 init.py 中,但可以/应该存在于它们自己的文件中以进行分离。 mikegrouchy.com/blog/2012/05/be-pythonic-__init__py.html 是一篇很好的文章。
【解决方案3】:

不同的question 但答案相同:

我通常的 django 网站布局是:

projects/
templates/
common/
local/

地点:

  • projects 包含您的主要项目和任何其他项目
  • common 包含您可以跨站点共享的内容,或者至少不是特定于项目的内容,例如如果您需要下载 django-profile 和 django-registration 而不是直接在 python/site-packages 中拥有它
  • 模板只包含这些
  • local 包含特定于当前机器的内容,以便您可以正确分离数据,例如数据库位置和密码 - 然后我软链接特定于机器的版本(例如“machine1-localconfig.py ") 到 local/localconfig.py 然后可以在 settings.py 中“导入 localconfig”
  • 我一般将项目特定的中间件放在项目中,非项目特定的中间件放在 common/middleware/ 中
  • 确保将模板目录添加到设置中的正确位置(或者很可能是 localconfig.py,然后将其导入设置中),并确保将项目、公共和本地目录添加到您的 PYTHONPATH。

【讨论】:

  • 感谢您的回复,eruciform。那么,对于我上面的“light_encrypt(number)”示例,你会建议我把它放在一起吗?
  • 是的,如果有一天你打算在另一个项目中使用它,最好将它放在common/util/encrypt.py(或其他)中,并确保它没有指向任何项目的内部链接-具体的。如果您以后需要移动东西,它会更容易重用,也更容易移植。从数据隐藏的角度来看,也只是更清洁。 :-)
  • 哦,如果你把它放在common/util/encrypt.py,请确保触摸空白common/util/__init__.py,以便from common.util.encrypt import light_encrypt正常工作
猜你喜欢
  • 1970-01-01
  • 2011-03-04
  • 1970-01-01
  • 1970-01-01
  • 2022-10-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多