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了。

如果有时间,我可能会把整体结构和来源写成一篇文章。

广告
将在 10 秒后关闭
bannerAds