【问题标题】:How to serve collected static files with Django's development server?如何使用 Django 的开发服务器提供收集的静态文件?
【发布时间】:2017-05-28 14:58:12
【问题描述】:

我正在尝试让 Django 的开发服务器为 python manage.py collectstatic 命令收集的静态文件提供服务。现在我失败了。

我的 Django 设置文件声明了这一点:

STATIC_ROOT = os.path.join(WWW_PATH, 'static')
STATIC_URL = '/static/'
STATICFILES_DIRS = (
    os.path.join(ROOT_PATH, 'front', 'public'),
    os.path.join(ROOT_PATH, 'front', 'dist')
)

这使得collectstatic 命令将文件从os.path.join(ROOT_PATH, 'front', 'public')os.path.join(ROOT_PATH, 'front', 'dist') 复制到STATIC_ROOT,并且完美运行。

我假设它还会告诉 Django 在STATIC_ROOT 目录中查找静态文件,但我错了。即使STATIC_ROOT 目录不存在,Django 也能够提供静态文件。但是如果os.path.join(ROOT_PATH, 'front') 丢失,Django 将不再提供静态文件。

这表明 Django 继续从源目录而不是 STATIC_ROOT 提供静态文件。

所以我想知道是否有办法指示 Django 的开发服务器从STATIC_ROOT 提供静态文件。有什么提示吗?

编辑:

在@e4c5 的回答之后,我像这样修改了我的根urls.py

static_patterns = [
    url(r'^$', TemplateView.as_view(template_name='index.html'))
]

urlpatterns = [
    url(r'^', include(static_patterns)),
    url(r'^admin/', admin.site.urls),
    url(r'^api/resa/', include('reservation.urls')),
    url(r'^api/auth/', include('authentication.urls')),
] + static(settings.STATIC_URL, document_root=settings.STATIC_ROOT)

不幸的是,它没有预期的结果并且 Django 在STATIC_ROOT 中找不到静态文件,我怀疑它实际上在STATIC_ROOT 中查找静态文件。

这是我在访问索引页面时在控制台中看到的内容:

[04/Jun/2017 16:18:05] "GET / HTTP/1.1" 200 1411
[04/Jun/2017 16:18:05] "GET /static/style/index.css HTTP/1.1" 404 1759
[04/Jun/2017 16:18:05] "GET /static/style/react-datetime.css HTTP/1.1" 404 1786
[04/Jun/2017 16:18:05] "GET /static/style/react-big-calendar.css HTTP/1.1" 404 1798
[04/Jun/2017 16:18:05] "GET /static/script/bundle.js HTTP/1.1" 404 1762

这里是设置变量的内容:

>>> from django.conf import settings
>>> settings.WWW_PATH
'/home/tryph/PycharmProjects/resa/www'
>>> settings.STATIC_ROOT
'/home/tryph/PycharmProjects/resa/www/static'
>>> settings.STATIC_URL
'/static/'

这是WWW_PATH目录的内容:

/home/tryph/PycharmProjects/resa/www
└── static
    ├── admin
    │   [...]
    ├── favicon.ico
    ├── index.html
    ├── rest_framework
    │   [...]
    ├── script
    │   └── bundle.js
    └── style
        ├── index.css
        ├── react-big-calendar.css
        └── react-datetime.css    

【问题讨论】:

  • 你的 manage.py 不是在一个名为 back 的文件夹中吗?ROOT_PATH = os.path.dirname(BASE_DIR) WWW_PATH = os.path.join(ROOT_PATH, 'www') STATIC_ROOT = os.path.join(WWW_PATH, 'static') 表示它正在寻找 app/back/www/static 中的静态文件?
  • @filtfilt 感谢您的建议。 settings.py 中定义的路径似乎是相对于settings.py 位置定义的,而不是manage.py 位置。因此,STATIC_ROOT 路径的一切看起来都不错。请参阅我的编辑了解更多详细信息。
  • 这个怎么样? 所有静态文件都由 gulp 管理,并位于“public”和“dist”目录中
  • @Robert 我不记得这条评论了,它可能是来自旧副本/粘贴的人工制品。我将删除它以避免混淆。实际上,publicdist 目录是前端项目存储样式、脚本、图标等的地方......它们是manage.py collectstatic 命令查找要复制到www/static 中的静态文件的目录
  • 服务器重载了吗?

标签: django


【解决方案1】:

这是使用static.serve完成的

除了项目的静态资产之外,可能还有其他文件,用于 方便,您希望 Django 在本地为您服务 发展。 serve() 视图可用于为您提供的任何目录 给它。 (此视图未针对生产使用进行强化,应 仅用作发展援助;你应该提供这些文件 使用真正的前端 Web 服务器进行生产

像这样改变你的 urls.py:

from django.conf import settings
from django.conf.urls.static import static
urlpatterns = [
    # ... the rest of your URLconf goes here ...
] + static(settings.STATIC_URL, document_root=settings.STATIC_ROOT)

【讨论】:

  • 感谢您的回答,我刚刚阅读了文档,这看起来不错。我目前无法测试它。如果它确实解决了我的问题,我稍后会接受答案。
  • 后来怎么样了?
  • 我刚试过,不幸的是,它不起作用:/
  • 非常确定您已经认真地遵循了这些步骤,因为这很有效。
  • 这行不通,因为serve 使用 STATICFILES_FINDERS,而且他们不看STATIC_ROOT
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-03-01
  • 2017-11-15
  • 2012-01-30
  • 2011-10-10
  • 1970-01-01
  • 2014-03-13
  • 2011-12-04
相关资源
最近更新 更多