Python django部署单独的web和;heroku上的api端点
我有一个带有相关API和数据库的web应用程序 我希望在API中使用相同的Django模型,但它由不同的进程分别提供服务,这样我就可以独立地扩展它 我也不需要API来服务静态资产或任何其他视图 复杂的是,我定义的路由具有共享根域的API和webapp: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
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
?我看不出它有什么区别。这实际上对共享域不起作用,但这可能是最好的答案。请参阅格雷厄姆的答案,以了解对形势的最正确评估