Django 2.2静态/媒体文件未显示/处理

时间:2019-09-14 01:17:55

标签: python django

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

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

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

最终结果应该是这样:

enter image description here

这实际上是我的样子:

enter image description here

在我的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/'

这是我的文件树:

enter image description here

Here is my (forked) source code repo on GitHub

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

3 个答案:

答案 0 :(得分: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),

]

答案 1 :(得分:1)

我想通了。

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

try:
    from .local_settings import *
except ImportError:
    pass

记录local_settings之前的时期。这将引用同一目录中隐藏的.local_settings.py文件。在我的实际配置中,我的生产设置文件并未真正隐藏。我的生产设置只是在项目目录中以local_settings.py存在。实际上没有前缀前缀。鉴于没有正确引用我的生产设置,这就是我的问题。

我真的应该在原始问题中包括生产设置配置文件的详细信息。我不确定我怎么想念这个。

我的生产DEBUG变量设置设置为False,但是当我尝试运行服务器时,Django实时环境仍在Web浏览器中显示调试信息。因此,这本来应该吸引我,但是上周末我第一次提出这个Stack Overflow问题时就错过了那个。

现在,我可以让服务器正常运行并解析静态文件和媒体文件,但是原始设置会有所更改。因此,我仍然无法正确调用local_settings.py。稍后,我将写一个单独的问题,关于如何正确调用生产设置。

以下是我对目前正在使用的主要settings.py所做的临时更改:

  1. ALLOWED_HOSTS包含我服务器的IP地址。
  2. 我的DATABASES词典是指基本的测试SQLite配置,而不是更高级的PostgreSQL。
  3. 我将其设置为os.path.join(BASE_DIR, 'static'),而不是STATIC_ROOT设置为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)。但是,无论我注释掉还是在该行中注释,服务器似乎都可以继续解析静态和媒体文件而没有问题。

答案 2 :(得分:0)

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