【问题标题】:Django 2.2 static / media files not showing / processingDjango 2.2 静态/媒体文件未显示/处理
【发布时间】:2020-01-15 19:27:20
【问题描述】:

我正在尝试部署我的 Django 讲师 (Udemy) 的“房地产”项目。 Here is Brad Traversy’s gist

在我的 VPS 上,我运行的是 Ubuntu 18.04、Python 3.6.8 和 Django 2.2.4。

我遵循了 Brad 的 Django 部署指南。我有点让它运行,但没有提供静态文件(CSS、JS 和图像)。这是我的配置的一个问题,我不清楚我在这里做错了什么或者我到底错过了什么。

最终结果应该是这样的:

这是我的实际样子:

在我的 settings.py 中探索关于 SO 的其他问题和答案,我尝试使用 join 方法将不同的路径换入(和换出)到 STATIC_ROOT、MEDIA_ROOT、STATICFILES_DIRS。我还尝试将许多不同的列表项添加到 urls.py 中的 urlpatterns 变量中。在尝试每个新的潜在更改后,我输入python manage.py collectstatic,然后运行服务器。有时会有追溯阻止服务器运行。在这些情况下,我只是将更改回滚到已知可以工作的设置,或者,我只是尝试了其他完全可以使服务器在没有回溯的情况下运行的方法。

根据@IrrupTor 的回答,在本地运行此项目时,静态和媒体文件完美解析。因此,这证实了我的 VPS 上的远程配置中存在问题。我还可以提供哪些其他信息来更好地阐明为什么我的 VPS 上没有加载静态和媒体文件?

以下是我已经使用过的关于 SO 的其他一些问题:

这是我的 Django shell 中的输出:

python manage.py runserver 0.0.0.0:8000
Performing system checks...

System check identified no issues (0 silenced).
September 14, 2019 - 00:44:11
Django version 2.2.4, using settings 'btre.settings'
Starting development server at http://0.0.0.0:8000/
Quit the server with CONTROL-C.
[14/Sep/2019 00:44:15] "GET / HTTP/1.1" 200 13775
[14/Sep/2019 00:44:15] "GET /static/css/bootstrap.css HTTP/1.1" 404 77
[14/Sep/2019 00:44:15] "GET /static/css/all.css HTTP/1.1" 404 77
[14/Sep/2019 00:44:15] "GET /static/css/style.css HTTP/1.1" 404 77
[14/Sep/2019 00:44:15] "GET /static/css/lightbox.min.css HTTP/1.1" 404 77
[14/Sep/2019 00:44:15] "GET /static/js/jquery-3.3.1.min.js HTTP/1.1" 404 77
[14/Sep/2019 00:44:15] "GET /static/img/logo.png HTTP/1.1" 404 77
[14/Sep/2019 00:44:15] "GET /static/js/lightbox.min.js HTTP/1.1" 404 77
[14/Sep/2019 00:44:15] "GET /static/js/bootstrap.bundle.min.js HTTP/1.1" 404 77
[14/Sep/2019 00:44:15] "GET /static/js/main.js HTTP/1.1" 404 77
[14/Sep/2019 00:44:15] "GET /static/js/lightbox.min.js HTTP/1.1" 404 77
[14/Sep/2019 00:44:15] "GET /static/js/main.js HTTP/1.1" 404 77

这是我的 urls.py:

from django.contrib import admin
from django.urls import path, include
from django.conf import settings
from django.conf.urls.static import static

urlpatterns = [
    path('', include('pages.urls')),
    path('listings/', include('listings.urls')),
    path('accounts/', include('accounts.urls')),
    path('contacts/', include('contacts.urls')),
    path('admin/', admin.site.urls),

] + static(settings.STATIC_URL, document_root=settings.STATIC_ROOT)

这是我的 settings.py 中的相关行:

# Static files (CSS, JavaScript, Images)
# https://docs.djangoproject.com/en/2.1/howto/static-files/

STATIC_ROOT = os.path.join(os.path.dirname(BASE_DIR), "static")

STATIC_URL = '/static/'
STATICFILES_DIRS = [
    os.path.join(BASE_DIR, 'btre/static')
]

# Media Folder Settings
MEDIA_ROOT = os.path.join(BASE_DIR, 'media')
MEDIA_URL = '/media/'

这是我的文件树:

Here is my (forked) source code repo on GitHub.

最后一点:现在我在我的 VPS 上使用 Django 的测试服务器。我意识到这不是最佳实践,因为它不安全。我只是使用 Django 的内置服务器作为垫脚石进行部署。加载静态和媒体文件后,我会立即切换到 nginx 和 gunicorn,如原始指南中所述。

【问题讨论】:

  • 我通常只是将静态文件放在我网站的根目录中,这样您就可以通过 {{ url }}/static/js/thingy.js 访问它们

标签: python django


【解决方案1】:

我试图重现你的错误:

settings.py 配置运行良好,

但是当我在 urls.py 中添加静态 url 配置时,我也收到了 404 错误。

我建议将 urls.py 修改为以下内容:

from django.contrib import admin
from django.urls import path, include
from django.conf import settings
from django.conf.urls.static import static

urlpatterns = [
    path('', include('pages.urls')),
    path('listings/', include('listings.urls')),
    path('accounts/', include('accounts.urls')),
    path('contacts/', include('contacts.urls')),
    path('admin/', admin.site.urls),

]

【讨论】:

  • 嗨,IrrupTor!谢谢你的建议。在我的远程服务器上,我尝试删除静态 url 函数调用,但问题仍然存在于 urls.py 中。不同之处可能是我的远程服务器上存在导致问题的其他设置或线路。您正在本地机器上进行测试,对吗?不幸的是,我无法在本地进行测试,因为 Manjaro 上的包维护者已经为我们所有用户“破坏”了 pip,所以我今天无法构建我的 venv。希望几天后我会在为我的操作系统修复 pip 后尝试在本地进行测试。我会尽快在这里报告。
  • 我今天在本地使用pip成功搭建了Django。我可以确认该项目在本地运行良好,无论是否包含在 urls.py 底部的+ static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT)。我的问题是我的远程服务器上的配置。我可以在关于 SO 的原始问题中提供哪些其他信息,以更好地诊断和缩小 VPS 上的问题?
【解决方案2】:

我想通了。

在我原始配置的 settings.py 底部,我尝试使用以下命令导入单独的生产设置:

try:
    from .local_settings import *
except ImportError:
    pass

记下local_settings 之前的时间段。这将引用同一目录中隐藏的 .local_settings.py 文件。在我的实际配置中,我的生产设置文件实际上并没有隐藏。我的生产设置仅作为 local_settings.py 存在于项目目录中。实际上没有句号前缀。鉴于我的生产设置没有正确引用,这是我的问题。

我真的应该在我最初的问题中包含我的生产设置配置文件的详细信息。我不知道我是怎么错过的。

我的生产DEBUG 变量设置设置为False,但当我尝试运行我的服务器时,我的 Django 实时环境仍在我的 Web 浏览器中显示调试信息。所以这应该已经让我知道了,但上周末我第一次组装这个 Stack Overflow 问题时错过了那个。

现在我让服务器正常运行和解析静态和媒体文件,但我的原始 settings.py 发生了变化。所以我仍然没有正确调用 local_settings.py。稍后我将写一个关于如何正确调用生产设置的单独问题。

以下是我对主要 settings.py 所做的临时更改,现在对我有用:

  1. ALLOWED_HOSTS 包括我的服务器的 IP 地址。
  2. 我的 DATABASES 字典指的是基本的测试 SQLite 配置,而不是更高级的 PostgreSQL。
  3. 我没有将 STATIC_ROOT 设置为 os.path.join(BASE_DIR, 'static'),而是将其设置为 os.path.join(os.path.dirname(BASE_DIR), "static")

我还更改了结尾的 urlpatterns 静态函数调用以包含以下内容:+ static(settings.STATIC_URL, document_root=settings.STATIC_ROOT) + static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT)。但是,无论我在该行中注释还是注释,服务器似乎都会继续解析静态和媒体文件而没有问题。

【讨论】:

    【解决方案3】:

    不,.local_settings 并不意味着您需要有一个 '.local_settings.py' 文件。

    【讨论】:

    • 请在您的答案中添加一些细节。仅仅说明它不是关于什么的,是没有帮助的。
    猜你喜欢
    • 2021-06-24
    • 2021-05-30
    • 2012-07-14
    • 2012-05-14
    • 2013-09-14
    • 2018-10-06
    • 1970-01-01
    • 2018-08-27
    • 1970-01-01
    相关资源
    最近更新 更多