gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-02 03:22:51 26 4
gpt4 key购买 nike

首先,google 或 SO 搜索对我没有帮助:很多关于 django 静态文件的提示,我认为这些与这里无关。

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

  • 以 API 形式返回 JSON 响应的 Django 后端;
  • 标准的 Swampdragon 部署将实时更新推送到前端;这里只做了很少的配置;
  • 基于 Backbone 和 marionette.js 构建的前端网络应用程序,由 Grunt 编译和压缩。

我的问题是:前端需要知道 swampdragon 和 django 服务器的地址;现在这些值是硬编码的,所以有一个 Backbone 模型,其中包含如下行:

url: function() {
return App.BACKEND_URL+'settings/map';
}

为什么硬编码:后端可以在任何端口上提供服务,或者有一个自己的子域;前端是静态的,通常会简单地放入/var/www(对于 Apache)或使用一些非常简单的 nginx 配置。两者都将从同一个地方提供服务,但不能保证端口号或子域匹配。

想法 1:尝试通过获取 window.location.host 并附加标准端口来猜测来自 javascript 的 BACKEND_URL 是什么。这是骇人听闻且容易出错的。

想法 2:将前端移至 Django 并让它询问 swampdragon 凭据(它们将在主页 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 hacks 来猜测端口号

反向代理

使用反向代理,例如 nginx 或您喜欢的任何其他网络服务器作为静态文件 REST API 的前端。

In computer networks, a reverse proxy is a type of proxy server that retrieves resources on behalf of a client from one or more servers. These resources are then returned to the client as though they originated from the proxy server itself. (Wikipedia)

我将概述重要方面,但不会过多介绍:

REST API 的 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 )

http://nginx.org/en/docs/http/ngx_http_proxy_module.html

我们的前端应用程序的 URL

接下来 nginx 将提供来自 grunt 的静态文件,只需将其指向静态文件夹即可

location / { alias /app/static/; }

以上假定您的静态资源位于/app/static/ 文件夹中(如index.html、您的CSS、JS 等)。所以这主要是为了加载您的 BackboneJS 应用程序。

Django 静态文件

下一步不是必需的,但如果您有与 Django 应用程序一起使用的静态文件(使用 ./manage.py collectstatic 生成的静态文件,例如 django 管理或 UI Django REST Framework 等),只需根据您的 Django settings.py STATIC_URLSTATIC_ROOT

进行映射
location /static { alias /app/django_static_root/; }

/staticdjango_static_root 分别是 STATIC_URLSTATIC_ROOT

总结

例如当您点击 example.com/ 时,nginx 只是提供静态文件,然后当 JS 脚本对 /api 进行 REST 调用时,它会陷入 /api nginx 位置并转发给 Django

最终结果是,example.com/example.com/api 都访问了同一个前端 Web 服务器,该服务器将它们代理到正确的位置

至此,保留代理解决了您的端口和子域问题(以及许多其他问题,例如来自 Django 的缓慢静态文件以及网络浏览器和防火墙中的同源策略,除了默认的 HTTP 和 HTTPS 端口外不喜欢任何东西)

关于django - 如何部署连接到 Django RESTful API 的静态网站?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32148124/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com