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

Python django部署单独的web和;heroku上的api端点,python,django,heroku,procfile,Python,Django,Heroku,Procfile,我有一个带有相关API和数据库的web应用程序 我希望在API中使用相同的Django模型,但它由不同的进程分别提供服务,这样我就可以独立地扩展它 我也不需要API来服务静态资产或任何其他视图 复杂的是,我定义的路由具有共享根域的API和webapp: http://domain.com/normal/application/stuff http://domain.com/api/different/stuff 此外,我的Django应用程序依赖于彼此的模型和常量(因此,两个不同的settin

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

我希望在API中使用相同的Django模型,但它由不同的进程分别提供服务,这样我就可以独立地扩展它

我也不需要API来服务静态资产或任何其他视图

复杂的是,我定义的路由具有共享根域的API和webapp:

http://domain.com/normal/application/stuff
http://domain.com/api/different/stuff
此外,我的Django应用程序依赖于彼此的模型和常量(因此,两个不同的
settings.py
文件以及不同的
安装的应用程序并不能完全解决这个问题)

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


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

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

正如Daniel所说,您可以使用两个共享基础的设置文件。如果您想为url的子集提供服务,您还应该在
ROOT\u 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
from .base import *
ROOT_URLCONF = 'project.urls.normal
settings/normal.py(api的模拟)是这样的:

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
from .base import *
ROOT_URLCONF = 'project.urls.normal

两个wsgi文件和两个设置文件可以工作。但是,如果应用程序之间存在任何依赖关系(因此无法从已安装的应用程序中删除应用程序),它仍将通过URL.py服务于所有不同的端点,是吗?FWIW,您想做的更大问题不是如何配置Django,而是您想在同一域名下同时执行这两个操作。这意味着,如果您希望能够在动态级别上单独扩展分段的应用程序,则无法将其拆分到单独的web动态对象上。一些WSGI服务器确实提供了足够的配置能力,可以在一台主机内分割web应用程序,并为应用程序的不同部分指定不同数量的进程/线程,但是Heroku推荐的gunicorn WSGI服务器不是其中之一。我是否仍然可以使用一个Django应用程序/Heroku应用程序,但为一个域和一个子域分别设置一个settings.py?如果使用Apache/mod_WSGI作为WSGI服务器,您可以这样做,但Heroku安装程序不允许在Python 2.7中运行。它只能与Python3.3+一起使用,但仍然需要mod_wsgi的一些技巧才能将其安装到Heroku上。不幸的是,不能保证Heroku不会改变任何东西,因此不能在Python3.3+上工作。我认为你对形势的评估是最正确的。谢谢这似乎可以解决问题。这样做有什么缺点吗?比如说,将应用程序分为一个(正常)服务于域,另一个(api)服务于子域?我想不出有什么缺点——如果请求进来,gunicorn如何知道服务于哪个进程?两个进程是否都会检查它们的
url.py
?我看不出它有什么区别。这实际上对共享域不起作用,但这可能是最好的答案。请参阅格雷厄姆的答案,以了解对形势的最正确评估