我最近在我的DigitalOcean Droplet上部署了一个Django项目。我需要在root的子文件夹(即www.domainname.com/)中访问它。到目前为止,这可以在apache配置文件中使用WSGI Aliasing。我在提供静态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配置:
在sites-available / default中:
<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>
答案 0 :(得分:2)
您需要在Apache配置中使用Alias
directive,以便提供静态文件。
与在提供服务之前通过Django视图呈现的模板不同,静态文件通常由Web服务器(或某些单独的服务)直接提供以提高性能。毕竟你通常只想要文件本身,因此Django所需的开销是不必要的。这在Django的文档here中进行了讨论。
没有Alias
指令,请求将传递给Django进行处理。 Django直接从DocumentRoot
提供Apache的默认行为,将URL映射到视图,然后构建响应。因此,根据您的urls.py
排列,静态文件请求可能会从匹配的视图中生成404页面或响应(您正在查看的HTML)。
要解决此问题,您可以添加
Alias /static/ /var/www/html/<project name>/static/
到配置文件中的虚拟主机。当在以/static/
开头的URI发出请求时,这将告诉Apache提供静态目录中的文件。
例如,URI /static/index.js
将导致Apache将文件/var/www/html/<project name>/static/index.js
作为响应提供。
此外,您的VirtualHost
中也有错误。您提供的地址为<project name>
,这不是有效选项(see here)。虚拟主机地址必须是IP地址,域名或通配符*
。
由于<project name>
不是这些,因此虚拟主机与任何内容都不匹配,并且不应用其中的配置。我建议通过更改
<VirtualHost <project name>:8000>
到
<VirtualHost *:8000>
将匹配请求所需的任何主机。