Django中的工具函数应该放在何处?
在Django中,工具函数应该放在哪里呢?这些函数可能是自定义的加密/解密数字、发送推文、发送邮件、验证对象的所有权、定制输入验证等等。这些都是我在应用中多次使用的重复性和自定义的功能。现在我肯定是违反了DRY原则(不要重复自己)。
我看到一些示例中,函数被定义在models.py文件里,但我觉得这样做不太合适。那这些函数应该放在一个“工具”应用里,然后导入到我的项目中吗?如果是这样的话,它们应该放在工具应用的哪个地方呢?是在那里的models.py文件里吗?
谢谢你们帮这个菜鸟解答。
更新:让我更具体一点。假设我需要一个函数“light_encrypt(number)”,它接收一个参数“number”,将它乘以7,加上10,然后返回结果;还有另一个函数“light_decrypt(encr_number)”,它接收一个参数“encr_number”,减去10,再除以7,最后返回结果。在我的Django项目结构中,我应该把这个放在哪里呢?这不是中间件,对吧?正如Felix所建议的,我是否应该创建一个Python包,并在需要这些函数的视图中导入它?
4 个回答
这里有另一种做法:
如果你的工具函数可以单独作为一个模块,并且你在为你的Django应用使用虚拟环境,那么你可以把这些功能打包成一个包,然后在你的虚拟环境中安装它。
这样的话,在你的Django应用中需要用到的时候就很方便地可以导入了。
好的,在阅读了这里的评论和回答后,我决定在我的项目目录里创建一个叫“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/
这是一个不同的问题,但答案是一样的:
我通常的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中。