Django Rest API的子路由在AWS Elastic Beanstalk上不可访问

Django Rest API的子路由在AWS Elastic Beanstalk上不可访问,django,amazon-web-services,google-app-engine,django-rest-framework,amazon-elastic-beanstalk,Django,Amazon Web Services,Google App Engine,Django Rest Framework,Amazon Elastic Beanstalk,我有一个使用Django Rest框架开发的Rest API。在本地运行时,它可以完全正常工作: python manage.py runserver 所有请求均按预期工作: 127.0.0.1:8000/ 127.0.0.1:8000/项目/ 现在,从AWS Elastic Beanstalk或Google App Engine等云服务部署时会出现问题。defaut路线工作正常,如下所示。但是,项目路径不会加载。平台接收到的请求代码为varys。App Engine给出了502错误网关代码,

我有一个使用Django Rest框架开发的Rest API。在本地运行时,它可以完全正常工作:

python manage.py runserver
所有请求均按预期工作:

127.0.0.1:8000/

127.0.0.1:8000/项目/

现在,从AWS Elastic Beanstalk或Google App Engine等云服务部署时会出现问题。defaut路线工作正常,如下所示。但是,项目路径不会加载。平台接收到的请求代码为varys。App Engine给出了502错误网关代码,Beanstalk给出了504网关超时。使用Beanstalk,运行eb日志不会显示任何错误

projects-restapi-dev.us-west-2.elasticbeanstalk.com/

projects-restapi-dev.us-west-2.elasticbeanstalk.com/projects

我确信这个问题与我如何表达自己的观点有关。这是我的URL.py

from django.contrib import admin
from django.conf.urls import url
from django.urls import path, include
from projects.views import ProjectView
from rest_framework import routers

router = routers.DefaultRouter()
router.register(r'projects', ProjectView)

urlpatterns = [
    path('', include(router.urls)),
    path("projects/", ProjectView),
    path("admin/", admin.site.urls),
    path("api-auth/", include('rest_framework.urls'))
]

此外,如果您需要查看任何其他文件,请提供指向github repo的链接。

发生此问题的原因是Django应用程序试图从未被授予访问权限的IP访问数据库。在本地服务器上运行时,数据库会识别白名单中的IP并允许访问。当从PaaS(如AWS、AppEngine或Python)运行时,您可能会从一系列可能的IP访问数据库

使用Google托管SQL并使用App Engine的用户的简单修复程序:

在SQL实例的“连接”选项卡中启用专用IP

这使您能够从运行在谷歌云服务上的另一个应用程序连接到SQL实例


如果您使用Google托管SQL,并在另一个PaaS上部署您的应用程序,那么解决方案将更加复杂。解决方案因平台而异,因此需要根据具体情况进行一些补充研究。

您的数据库ip和端口是否可公开访问?因为如果ELB正在重新运行504超时,则表示您的应用程序正在尝试连接数据库,但无法连接。我检查了您的数据库主机ip 35.196.52.118,该主机的postgres端口5432未开放给公众访问。另外,建议您不要将数据库凭据和其他机密公开放在公共git项目中。使用环境变量来管理它们。那么,当我从dev服务器部署Django时,为什么它会起作用呢?这个IP不是本地的,它是由Google SQL托管的。另外,我知道环境变量的事情。我一直在考虑这个问题,但目前这并不是什么秘密。没有什么是最终确定的,我只是测试服务。