- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
首先,google 或 SO 搜索对我没有帮助:很多关于 django 静态文件的提示,我认为这些与这里无关。
我继承了一个项目,包括:
我的问题是:前端需要知道 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)
我将概述重要方面,但不会过多介绍:
我们进行配置,以便 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
接下来 nginx 将提供来自 grunt 的静态文件,只需将其指向静态文件夹即可
location / { alias /app/static/; }
以上假定您的静态资源位于/app/static/
文件夹中(如index.html
、您的CSS、JS 等)。所以这主要是为了加载您的 BackboneJS 应用程序。
下一步不是必需的,但如果您有与 Django 应用程序一起使用的静态文件(使用 ./manage.py collectstatic
生成的静态文件,例如 django 管理或 UI Django REST Framework 等),只需根据您的 Django settings.py
STATIC_URL
和 STATIC_ROOT
location /static { alias /app/django_static_root/; }
/static
和 django_static_root
分别是 STATIC_URL
和 STATIC_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/
我正在开发一个 voip 调用应用程序。我需要做的是在接到来电时将 Activity 带到前台。我在应用程序中使用 Twilio,并在收到推送消息时开始调用。 问题是我试图在接到任何电话时显示 Act
我是一名优秀的程序员,十分优秀!