[英]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.