Django无法读取静态资源(如js和css)的处理方法
Django无法查看静态源代码。
在本地(开发环境)中,我们使用DEBUG = True和runserver来运行应用程序。但是,为了创建类似于生产环境的环境,我们将DEBUG设置为False,并使用Apache服务器(容器)进行构建和运行。然而,当我们这样做后,CSS文件产生了404错误(因为其MIME类型为’text/html’),导致无法读取。
前提 – 假设、条件、先决条件
使用Docker时,将应用程序(Python Django)的容器和web(Apache)的容器分离。
→在Django中,有很多关于无法查看静态文件的解决方案,但是Django和Apache通常在同一个服务器(容器)内,问题无法得到解决。
应对
常见的应对方式
DEBUG = False # これがFalseなのが大前提。Trueだとstaticもdjangoが提供する
STATIC_URL = 'static/'
STATIC_ROOT = '/var/www/static/'
<VirtualHost *:80>
Alias /static/ /var/www/static/
<Directory /var/www/static/>
Require all granted
</Directory>
</VirtualHost>
执行此命令将会将位于static目录中的文件收集到/var/www/static/中,使得apache可以将带有”/static/”的URL映射到”/var/www/static/”,从而可以访问静态文件。
第一个问题是什么?
尽管执行了 python3 manage.py collectstatic 命令,文件仅会被收集到 Django 服务器(容器)的 /var/www/static/ 目录中,所以 Apache 服务器无法查看。
使用Docker Compose,在django和apache中共享/var/www/static/。
version: '3'
services:
python-django:
volumes:
- static-data:/var/www/static/
command: sh -c "python3 manage.py collectstatic --noinput & python3 manage.py process_tasks & uwsgi --http 0.0.0:8000 --module プロジェクト名.wsgi --master"
apatch:
volumes:
- static-data:/var/www/static/
volumes:
static-data:
第二個問題點
为了将Apache收到的请求内容传递给Django,需要添加代理设置
*除了静态文件以外!!
<VirtualHost *:80>
ProxyPreserveHost On
ProxyPass /static/ !
ProxyPass / http://djangoのコンテナ名:8000/
ProxyPassReverse / http://djangoのコンテナ名:8000/
Alias /static/ /var/www/static/
<Directory /var/www/static/>
Require all granted
</Directory>
</VirtualHost>
其实到目前为止,我已经按照正常的方式进行了调查和实施。查看日志后发现,静态(css)文件也发送请求到了Apache服务器,并被传递给了Django。
不应该将static传递给django,而是应该在Apache上进行处理…
因此添加“ProxyPass /static/ !”
将“static”排除在django之外。
现在我已经可以读懂static了。
如果有时间,我可能会把整体结构和来源写成一篇文章。