如何部署连接到Django RESTful API的静态网站?
首先,谷歌搜索并没有帮到我:关于django的静态文件的很多提示,我认为在这里是不相关的 我继承了一个项目,包括:如何部署连接到Django RESTful API的静态网站?,django,backbone.js,gruntjs,marionette,Django,Backbone.js,Gruntjs,Marionette,首先,谷歌搜索并没有帮到我:关于django的静态文件的很多提示,我认为在这里是不相关的 我继承了一个项目,包括: Django后端,API形式,仅返回JSON响应 标准部署将实时更新推送到前端;这里很少进行配置 前端webapp构建在主干网和木偶网上,由Grunt编译和缩小 我的问题是:前端需要知道沼泽龙和django服务器的地址;现在,这些值是硬编码的,因此有一个主干模型,其线条如下: url: function() { return App.BACKEND_URL+'setti
- Django后端,API形式,仅返回JSON响应李>
- 标准部署将实时更新推送到前端;这里很少进行配置李>
- 前端webapp构建在主干网和木偶网上,由Grunt编译和缩小
url: function() {
return App.BACKEND_URL+'settings/map';
}
为什么硬编码:后端可以在任何端口上提供服务,或者自身有一个子域;前端是静态的,通常会被简单地抛出到/var/www(对于Apache)中,或者使用一些非常简单的nginx配置。两者将从同一地点提供服务,但不能保证端口号或子域匹配
想法1:通过获取window.location.host并附加标准端口,尝试从javascript猜测后端URL是什么。这很老套,而且容易出错
想法2:将前端移动到Django,并让其请求Swarmagon凭据(它们将在home view的上下文中发送)。问题是,前端文件是由grunt编译的。因此,Django希望看到这样的情况:
<script src="{% static 'scripts/vendor/modernizr.js' %}"></script>
我确实有
<script src="scripts/vendor/a8bcb0b6.modernizr.js"></script>
其中“a8bcb0b6”是grunt的哈希/版本号,将在下一次缩小/构建期间重新生成。我是否需要添加额外的逻辑来摆脱这些东西,并将grunt的输出目录复制到django的静态和模板目录
还是有其他方法可以让这项工作正常进行,我缺少正确的方法?您的体系结构已经很干净,不需要让Django知道grunt或服务静态文件,也不需要使用JS黑客猜测端口号 反向代理 使用反向代理(如nginx)或您喜欢的任何其他web服务器作为静态文件和restapi的前端 在计算机网络中,反向代理是一种代理服务器 代表客户端从一个或多个服务器检索资源。 然后将这些资源返回到客户端,就像它们 源于代理服务器本身。(维基百科) 我将概述重要的方面,但不太详细: RESTAPI的URL 我们进行配置,以便nginx将API请求转发给Django
location /api {
proxy_pass http://127.0.0.1:8000; # assumes Django listens here
proxy_set_header Host $http_host; # preserve host info
}
因此,上面假设您的Django REST映射到/api
,并在端口8000
上运行(例如,您可以在该端口或任何其他您喜欢的服务器上运行gunicorn)
我们前端应用程序的URL
下一步,nginx将通过简单地将grunt指向静态文件夹来提供来自grunt的静态文件
location / { alias /app/static/; }
以上假设您的静态资源位于/app/static/
文件夹中(如index.html
、CSS、JS等)。因此,这主要是加载BackboneJS应用程序
Django静态文件
下一步不是必需的,但如果您有Django应用程序使用的静态文件(使用/manage.py collectstatic
生成的静态文件,例如Django管理员或Django REST框架的UI等),只需根据您的Djangosettings.py
STATIC\u URL
和STATIC\u ROOT
location /static { alias /app/django_static_root/; }
/static
和django\u static\u root
分别是static\u URL
和static\u root
总结
例如,当您点击example.com/
时,nginx只是提供静态文件,然后当JS脚本对/api
进行REST调用时,它会被困在/api
nginx位置并转发到Django
location /api {
proxy_pass http://127.0.0.1:8000; # assumes Django listens here
proxy_set_header Host $http_host; # preserve host info
}
最终的结果是,example.com/
和example.com/api
都命中了相同的前端web服务器,这会将它们代理到正确的位置
因此,保留代理解决了您的端口和子域问题(以及许多其他问题,如来自Django的慢速静态文件,以及web浏览器和防火墙中的同源策略,除了默认HTTP和HTTPS端口之外,其他任何东西都不喜欢)