Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/backbone.js/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何部署连接到Django RESTful API的静态网站?_Django_Backbone.js_Gruntjs_Marionette - Fatal编程技术网

如何部署连接到Django RESTful API的静态网站?

如何部署连接到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的静态文件的很多提示,我认为在这里是不相关的

我继承了一个项目,包括:

  • Django后端,API形式,仅返回JSON响应
  • 标准部署将实时更新推送到前端;这里很少进行配置
  • 前端webapp构建在主干网和木偶网上,由Grunt编译和缩小
我的问题是:前端需要知道沼泽龙和django服务器的地址;现在,这些值是硬编码的,因此有一个主干模型,其线条如下:

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等),只需根据您的Django
settings.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端口之外,其他任何东西都不喜欢)