django 在 heroku 上部署单独的 web 和 api 端点

Posted

技术标签:

【中文标题】django 在 heroku 上部署单独的 web 和 api 端点【英文标题】:django deploying separate web & api endpoints on heroku 【发布时间】:2015-09-20 07:48:00 【问题描述】:

我有一个带有相关 API 和数据库的 Web 应用程序。

我想在 API 中使用相同的 Django 模型,但让它由不同的进程分别提供服务,以便我可以独立扩展它。

我也不需要 API 来提供静态资产或任何其他视图。

复杂之处在于我定义的路由有 API 和 webapp 共享根域:

http://domain.com/normal/application/stuff
http://domain.com/api/different/stuff

另外,我的 Django 应用程序依赖于彼此的模型和常量(因此两个不同的 settings.py 文件与不同的 INSTALLED_APPS 并不能完全解决它)。

我想一种方法是我可以在我的 Procfile 中定义不同的进程来启动 Django 应用程序,但是在其中一个进程中它可能有不同的环境变量?我认为我不能使用heroku:config 更改每个 Proc 的环境,我认为它实际上必须是 Procfile 中的一个指令。

有人对此有任何经验或见解吗?谢谢!

【问题讨论】:

FWIW,你想做的更大的问题不是如何配置 Django,而是你想在同一个域名下做这两个事实。这意味着如果您希望能够在测功机级别单独扩展分段应用程序,则不能将分段的应用程序拆分到单独的 Web 测功机上。一些 WSGI 服务器确实提供了足够的配置能力来分割一个主机内的 Web 应用程序,并为应用程序的不同部分指定不同数量的进程/线程,但 Heroku 推荐的 gunicorn WSGI 服务器不是其中之一。跨度> 我是否仍然可以使用单个 Django 应用程序/Heroku 应用程序,但有一个用于域的 settings.py 和一个用于子域的 settings.py? 如果你使用 Apache/mod_wsgi 作为 WSGI 服务器,你可以这样做,但是 Heroku 设置不允许它在 Python 2.7 上运行。只能在 Python 3.3+ 上使用它,然后它仍然需要 mod_wsgi 的一些技巧才能将其安装在 Heroku 上。不幸的是,不能保证 Heroku 不会改变,所以也不能在 Python 3.3+ 上运行。 好的,太好了。我认为你对形势的评估是最正确的。谢谢! 【参考方案1】:

正如丹尼尔所说,您可以只使用两个具有共享库的设置文件。如果您想提供 url 的子集,您还应该在 ROOT_URLCONF 设置中创建单独的 url 定义。

所以你的项目结构应该是这样的:

project/
    project/
       settings/
           __init__.py
           base.py
           normal.py
           api.py
       urls/
           __init__.py
           base.py
           normal.py
           api.py
       wsgi/
           __init__.py
           normal.py
           api.py

settings/normal.py(api 的模拟)会是这样的:

from .base import *
ROOT_URLCONF = 'project.urls.normal

【讨论】:

这似乎可以解决问题。这样做有什么缺点吗?比如说,将应用程序拆分为一个(正常)服务于域,另一个(api)服务于子域? 我想不到 等待 - 如果有请求进来, gunicorn 如何知道要服务于哪个进程?两个进程都会检查他们的urls.py 吗?我没有看到它可以区分的方法。 这实际上不适用于共享域,但它可能是最好的答案。请参阅格雷厄姆的回答,了解对情况的最正确评估【参考方案2】:

我认为您不需要不同的环境变量,只需一个单独的 WSGI 文件指向不同的 settings.py。这些设置文件可以从一个通用文件中导入共享设置,然后为 INSTALLED_APPS 设置它们的特定值。然后 Procfile 可以在单独的进程中引用那些 wsgi 文件。

【讨论】:

两个 wsgi 文件和两个设置文件可以工作。但是,如果应用程序之间存在任何依赖关系(因此无法从 INSTALLED_APPS 中删除应用程序),它仍然会通过 urls.py 服务于所有不同的端点,是吗?

以上是关于django 在 heroku 上部署单独的 web 和 api 端点的主要内容,如果未能解决你的问题,请参考以下文章

在 Heroku 上部署 Django\Tornado

在heroku上部署django网站时出错

在 Heroku 上部署 React 和 Django

如何在 Heroku 上使用 Channels 和 Celery 部署 Django?

在 Heroku 上部署时出现 Django 1.7 迁移错误

在 Heroku 上部署 Django/静态文件的正确方法