在根

时间:2017-01-31 18:45:05

标签: python django django-staticfiles

我最近在我的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>

1 个答案:

答案 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>

将匹配请求所需的任何主机。