簡體   English   中英

在root的子文件夾中使用Django項目和靜態文件

[英]Using a Django project and static files in a subfolder of root

我最近在我的DigitalOcean Droplet上部署了一個Django項目。 我需要在根目錄的子文件夾(即www.domainname.com/)中訪問它。 到目前為止,這可以在apache配置文件中使用WSGI別名來實現。 我在提供靜態js文件時遇到了麻煩。

我正在模板中使用{%static%}標記來執行此操作。 但是,當我在瀏覽器中檢查我的js文件時,似乎總是將其替換為當前頁面的html。 這是我在settings.py中與靜態相關的設置:

STATIC_URL = '/static/'
STATIC_ROOT = '/var/www/html/<project name>/static'

STATICFILES_DIRS = [
    os.path.join(BASE_DIR, "/static"),
]

更新1

這是我的Apache配置:

在網站可用/默認中:

<Directory /var/www/>
       Options Indexes FollowSymLinks MultiViews
       AllowOverride All
       Order allow,deny
       allow from all
</Directory>

<VirtualHost <project name>:8000>
    ServerName <project name>
    ServerAlias <domain>/<project name>
    ServerAdmin <email>

    DocumentRoot /var/www/html/<project name>
    WSGIScriptAlias /<project name>/ /var/www/html/<project name>/<project name>/wsgi.py

    ErrorLog /var/www/html/logs/error.log
    CustomLog /var/www/html/logs/custom.log combined
    WSGIPythonPath /var/www/html/<project name>
</VirtualHost>

在apache2.conf中:

WSGIScriptAlias /<project name> /var/www/html/<project name>/<project name>/wsgi.py
WSGIPythonPath /var/www/html/<project name>

<Directory /var/www/html/<project name>>
   <Files wsgi.py>
       Require all granted
   </Files>
</Directory>

更新2

似乎正在通過將靜態路徑附加到當前頁面的路徑來請求.js文件,即

<domain name>.com/<project name>/<app name>/<page>/<project name>/static/js/<js file name>

您需要在Apache配置中使用Alias指令 ,以便為您的靜態文件提供服務。

與模板不同,模板是在提供服務之前通過Django視圖呈現的,而靜態文件通常由Web服務器(或某些單獨的服務)直接提供服務以提高性能。 畢竟,您通常只需要文件本身,因此Django所需的開銷是不必要的。 這是Django的文檔中討論這里

如果沒有Alias指令,該請求將傳遞給Django進行處理。 Django將Apache的默認行為從直接從DocumentRoot提供文件更改為將URL映射到視圖,然后構造響應。 因此,根據您的urls.py安排,靜態文件請求可能會導致404頁面或來自匹配視圖的響應(您正在看到的HTML)。

為了解決這個問題,您可以添加

Alias /static/ /var/www/html/<project name>/static/

到配置文件中的虛擬主機。 當以/static/開頭的URI發出請求時,這將告訴Apache從您的靜態目錄提供文件。

例如, /var/www/html/<project name>/static/index.js /static/index.js的URI將導致Apache將文件/var/www/html/<project name>/static/index.js作為響應。


另外,您的VirtualHost有一個錯誤。 您提供的地址是<project name> ,這不是一個有效的選項( 請參閱此處 )。 虛擬主機地址必須是IP地址,域名或通配符*

由於<project name>都不是,因此虛擬主機不匹配任何內容,並且不應用其中的配置。 我建議通過更改來修復它

<VirtualHost <project name>:8000>

<VirtualHost *:8000>

相反,它將在請求期望的任何主機上匹配。

暫無
暫無

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

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