【发布时间】:2017-03-30 21:39:14
【问题描述】:
我正在尝试构建一个简单的单页 Web 应用程序,其中 Web 服务器只提供静态内容,除非路由以“/api”开头 - 在这种情况下,请求被路由到 django。
文件结构如下:
ROOT
- manage.py
- static/ (static content)
- index.html
- app.min.js
- ...etc
- djangoapp/ (django "project")
- __init__.py
- settings.py
- urls.py
- wsgi.py
- api/ (django "app")
- __init__.py
- admin.py
- apps.py
- models.py
- tests.py
- views.py
在开发中 (DEBUG=true),我希望 django 像传统的 Web 服务器一样提供静态内容。这意味着不在 /api 下的内容应该只从 /static 提供,并且'/' 的 GET 应返回 index.html。
我已采取以下步骤:
- 用
django-admin startproject djangoapp创建了根django“项目” - 用
./manage.py startapp api创建了一个django“应用程序” - 创建了一个静态文件夹,其中包含一个虚拟 index.html 和 dummy.html。
- 更改了 django“应用程序”,在 /api/hello 创建了一个简单的“hello I am the api”端点,并创建了适当的路由
从这一点开始,我可以成功地设置一个 docker-compose 集群以按预期执行 - 调用 nginx edge for '/' 加载 ROOT/static/index.html 中的静态 index.html,调用 '/ api/hello' 被代理到 uwgi 服务器并相应地返回。但是,我一辈子都无法让 django 从它的 ./manage.py runserver
中执行此操作我很快从 Django 自己那里找到了执行此操作的指南:https://docs.djangoproject.com/en/1.10/howto/static-files/
但是,该文档中列出的建议都没有真正起作用。
设置
- 'STATIC_URL' 到 '/'
- 'STATIC_ROOT' 通过
os.path.join(BASE_DIR, "static")到项目的磁盘物理根目录
...不会以任何方式改变行为 - 对像 GET /dummy.html 这样的静态页面的请求不会路由
同时更改项目的 urls.py 以包含...的结果
django.conf.urls.static.static(settings.STATIC_URL, document_root=settings.STATIC_ROOT)
...也不会以任何方式改变行为。仅 404 秒。
我发现通过省略 STATIC_ROOT 值并将 STATICFILES_DIRS 值设置为磁盘上的物理文档根目录可以成功地提供静态文件 - 但会破坏所有其他端点(它们会抛出 404)。
环境:
- Debian jessie(稳定版)
- python 2.7.13(通过 pyenv 安装)
- django 1.10.6(通过 pip 安装)
【问题讨论】:
-
你的 urls.py 是什么样的?您是否按照文档中的建议进行操作? docs.djangoproject.com/en/1.10/howto/static-files/…
-
也就是
/api/url后面是不是放了静态url? -
@HåkenLid [这里] 是当前状态:gist.github.com/tonymke/43154a5bdf1f093c6fc9274edd2e7471。我发现从 INSTALLED_APPS 中删除 staticfiles 模块对我的目的有很大帮助。我让它正确地返回 /index.html、/dummy.html 和 API 端点。剩下要做的就是向 '/' 请求返回 index.html,一个 nginx。
-
对于这种情况,您可以使用 TemplateView 或 RedirectView。 docs.djangoproject.com/en/1.10/topics/class-based-views/…
-
这正是我需要的提示。谢谢!
标签: python django python-2.7