将Django项目的开发部分和生产部分分离

7
我正在建立一个网站,该网站依赖于机器学习算法的输出。对于用户界面部分,只需要算法的输出(一组项目的类标签),这可以很容易地从django模型中存储和检索。该算法可以每天运行一次,不依赖于用户输入。
因此,该网站的这一部分仅依赖于django和相关软件包。
但是,开发、调整和评估算法使用了许多其他Python软件包,例如scikit-learnpandasnumpymatplotlib等。它还需要保存许多不同的类标签集。
这些依赖关系在部署到heroku时会导致一些问题,因为numpy需要LAPACK/BLAS。在部署应用程序时尽可能少地使用依赖项似乎也是一个好习惯。
我该如何将机器学习部分与用户界面部分分离,但仍然使它们足够集成,以便轻松使用算法的结果?
我考虑创建两个单独的项目,然后以某种方式写入用户界面数据库,但这似乎会导致维护问题(管理依赖项、数据库模式的更改等)。
据我所知,这个问题与在生产和开发中使用不同的设置或数据库有些不同,因为它更多地涉及管理不同的依赖关系集。

你认为为什么管理依赖和数据库模式的更改是一个问题?不管怎样,你都必须处理它们,对吧? - Shang Wang
另外,我不确定你的标题是否准确。听起来好像网站和算法代码都将投入生产。 - Shang Wang
使用一个项目,我只需要在一个虚拟环境中安装所有依赖项。如果有两个项目具有部分重叠的依赖关系,似乎会更加复杂。除非有一种方式使一个环境成为另一个环境的子集。 - ajerneck
对于一个项目,我只让Django处理迁移,但是对于两个项目来说,这似乎更加复杂:例如,在哪个项目中运行迁移? - ajerneck
让我们在聊天中继续这个讨论:http://chat.stackoverflow.com/rooms/84846/discussion-between-ajerneck-and-shang-wang。 - ajerneck
显示剩余2条评论
3个回答

4

为了让其他人也能受益,建议将我们讨论的内容移至答案中。我的建议如下:

  1. 花些时间确定您的网站和算法代码的依赖关系。

  2. 将依赖项列表转储到每个项目的 requirements.txt 中。

  3. 在不同环境中部署它们,以避免冲突发生。

  4. 在您的网站端开发一些 API 端点,使用 Django Rest FrameworkTastypie,并让您的算法代码使用 API 更新模型。使用 cron 定期运行您的算法代码并推送数据。


1
为每个环境创建一个要求文件,并为所有环境共享的软件包创建一个基本要求文件。
 $ mkdir requirements
 $ pip freeze > requirements/base.txt
 $ echo "-r base.txt" > requirements/development.txt
 $ echo "-r base.txt" > requirements/production.txt

然后调整您的开发和生产依赖项,并在适当的环境中安装每个依赖项。
#change to your development virtualenv
#$source .virtualenvs/development/bin/activate
$ pip install -r requirements/development.txt

#change to your production virtualenv
#$source .virtualenvs/production/bin/activate
$ pip install -r requirements/production.txt

0

我更喜欢使用poetry作为我的依赖管理器。它允许您定义开发依赖项,而不是使用单独的requirements.txt文件,这样可以减少额外的工作量。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接