簡體   English   中英

Django 2.2 靜態/媒體文件未顯示/處理

[英]Django 2.2 static / media files not showing / processing

我正在嘗試部署我的 Django 講師 (Udemy) 的“房地產”項目。 這是 Brad Traversy 的要點

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

我已經按照 Brad 的指南來部署 Django。 我有點讓它運行,但沒有提供靜態文件(CSS、JS 和圖像)。 這是我的配置問題,我不清楚我在這里做錯了什么或者我到底缺少什么。

最終結果應該是這樣的:

在此處輸入圖片說明

這是我的實際外觀:

在此處輸入圖片說明

探索關於 SO 的其他問題和答案,在我的 settings.py 中,我嘗試使用 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/'

這是我的文件樹:

在此處輸入圖片說明

這是我在 GitHub 上的(分叉的)源代碼存儲庫

最后一點:現在我在我的 VPS 上使用 Django 的測試服務器。 我意識到這不是最佳實踐,因為它不安全。 我只是將 Django 的內置服務器作為墊腳石進行部署。 加載靜態和媒體文件后,我會立即切換到 nginx 和 gunicorn,如原始指南中所述。

我試圖重現您的錯誤:

使用 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),

]

我想通了。

在我的原始配置中 settings.py 的底部,我嘗試使用以下內容導入單獨的生產設置:

try:
    from .local_settings import *
except ImportError:
    pass

記下local_settings之前的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) 但是,無論我在該行中注釋還是注釋,服務器似乎都可以繼續解析靜態和媒體文件而不會出現問題。

不,.local_settings 並不意味着您需要有一個“.local_settings.py”文件。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM