Django中的工具函数应该放在何处?

68 投票
4 回答
38192 浏览
提问于 2025-04-16 01:36

在Django中,工具函数应该放在哪里呢?这些函数可能是自定义的加密/解密数字、发送推文、发送邮件、验证对象的所有权、定制输入验证等等。这些都是我在应用中多次使用的重复性和自定义的功能。现在我肯定是违反了DRY原则(不要重复自己)。

我看到一些示例中,函数被定义在models.py文件里,但我觉得这样做不太合适。那这些函数应该放在一个“工具”应用里,然后导入到我的项目中吗?如果是这样的话,它们应该放在工具应用的哪个地方呢?是在那里的models.py文件里吗?

谢谢你们帮这个菜鸟解答。

更新:让我更具体一点。假设我需要一个函数“light_encrypt(number)”,它接收一个参数“number”,将它乘以7,加上10,然后返回结果;还有另一个函数“light_decrypt(encr_number)”,它接收一个参数“encr_number”,减去10,再除以7,最后返回结果。在我的Django项目结构中,我应该把这个放在哪里呢?这不是中间件,对吧?正如Felix所建议的,我是否应该创建一个Python包,并在需要这些函数的视图中导入它?

4 个回答

5

这里有另一种做法:

如果你的工具函数可以单独作为一个模块,并且你在为你的Django应用使用虚拟环境,那么你可以把这些功能打包成一个包,然后在你的虚拟环境中安装它。

这样的话,在你的Django应用中需要用到的时候就很方便地可以导入了。

28

好的,在阅读了这里的评论和回答后,我决定在我的项目目录里创建一个叫“common/util/”的文件夹。在这个文件夹里,我放了一个叫“__ init__.py”的文件,里面存放我的一些小助手函数。

我想如果这个文件变得太大,我就会把这些函数分开,放到“common”文件夹里的不同.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/
38

这是一个不同的问题,但答案是一样的:

我通常的Django网站布局是:

projects/
templates/
common/
local/

其中:

  • projects文件夹里放的是你的主要项目和其他项目。
  • common文件夹里放一些可以在多个网站之间共享的东西,或者至少不是特定于某个项目的东西,比如你需要下载django-profile和django-registration,而不是直接放在python/site-packages里。
  • templates文件夹里就放模板文件。
  • local文件夹里放一些特定于当前机器的东西,这样你可以有清晰分开的数据,比如数据库的位置和密码。我会把机器特定的版本(比如“machine1-localconfig.py”)软链接到local/localconfig.py,然后在settings.py里“import localconfig”。
  • 我一般把特定于项目的中间件放在项目文件夹里,把不特定于项目的中间件放在common/middleware/文件夹里。
  • 确保在settings里把templates目录添加到正确的位置(或者更可能是在localconfig.py里添加,然后在settings里导入),同时确保把projects、common和local目录添加到你的PYTHONPATH中。

撰写回答