首页 > 编程问答 >Django-React 应用程序中的静态文件未在生产环境中加载

Django-React 应用程序中的静态文件未在生产环境中加载

时间:2024-07-28 05:21:25浏览次数:9  
标签:python reactjs django docker nginx

我正在 Docker 容器中运行 Django 应用程序,但在生产中提供静态文件时遇到问题。本地一切工作正常,但是当我部署到生产环境时,静态文件不会加载,并且出现 404 错误。

以下是我的设置的相关部分:

Django settings.py :

TEMPLATES = [
    {
        'BACKEND': 'django.template.backends.django.DjangoTemplates',
        'DIRS': [os.path.join(BASE_DIR, 'build')],
        'APP_DIRS': True,
        'OPTIONS': {
            'context_processors': [
                'django.template.context_processors.debug',
                'django.template.context_processors.request',
                'django.contrib.auth.context_processors.auth',
                'django.contrib.messages.context_processors.messages',
            ],
        },
    },
]

STATIC_URL = '/static/'
MEDIA_URL = '/media/'
STATIC_ROOT = '/vol/web/static'
STATICFILES_DIRS = [os.path.join(BASE_DIR, 'build', 'static')]

build 文件夹是由 React 应用程序中的 npm run build 命令生成的。

运行后 collectstatic ,卷 /vol/web/static 已正确填充。然而,浏览器对静态文件显示404错误,例如

GET https://site/static/js/main.db771bdd.js [HTTP/2 404 161ms]
GET https://site/static/css/main.4b763604.css [HTTP/2 404 160ms]

Loading failed for the <script> with source “https://www.aloconcursos.com/static/js/main.db771bdd.js”.

这些文件存在于 build/static 目录中,但我认为浏览器应该使用收集到 /vol/web/static 中的静态文件。

Nginx配置:| ||Dockerfile:

server {
    listen ${LISTEN_PORT};

    location /static {
        alias /vol/static;
    }

    location / {
        uwsgi_pass              ${APP_HOST}:${APP_PORT};
        include                 /etc/nginx/uwsgi_params;
        client_max_body_size    10M;
    }
}

我怀疑文件权限可能存在问题,但在更改权限后错误仍然存​​在。关于可能出现问题或如何进一步调试的任何见解?

FROM python:3.9-alpine

ENV PYTHONUNBUFFERED 1
ENV PATH="/scripts:${PATH}"

RUN pip install --upgrade "pip<24.1"

COPY ./requirements.txt /requirements.txt
RUN apk add --update --no-cache postgresql-client jpeg-dev \
    && apk add --update --no-cache --virtual .tmp-build-deps \
       gcc libc-dev linux-headers postgresql-dev musl-dev zlib zlib-dev libffi-dev \
    && pip install -r /requirements.txt \
    && apk del .tmp-build-deps

RUN mkdir -p /app /vol/web/media /vol/web/static
RUN adduser -D user
RUN chown -R user:user /vol /app

COPY ./app /app
COPY ./scripts /scripts
COPY ./requirements.txt /requirements.txt

RUN chmod -R 755 /vol/web /app /scripts \
    && chmod +x /scripts/*

USER user
WORKDIR /app

VOLUME /vol/web

CMD ["entrypoint.sh"]

任何帮助将不胜感激!

Any help would be greatly appreciated!


问题出在你的 Nginx 配置中。你正在使用 alias 指令来提供静态文件,但 alias 指令不修改 URL,因此 Nginx 会在错误的位置查找文件。

你应该使用 root 指令来代替 alias root 指令会修改 URL,并将请求指向正确的位置。

以下是更新后的 Nginx 配置:

server {
    listen ${LISTEN_PORT};

    location /static {
        root /vol/web;
    }

    location / {
        uwsgi_pass              ${APP_HOST}:${APP_PORT};
        include                 /etc/nginx/uwsgi_params;
        client_max_body_size    10M;
    }
}

这个配置将 /static URL 前缀映射到 /vol/web 目录。 因此,当浏览器请求 /static/js/main.db771bdd.js 时,Nginx 会在 /vol/web/static/js/main.db771bdd.js 中查找文件。

其他建议:

  • 确保 /vol/web/static 目录及其内容对 Nginx 进程有读取权限。 可以通过运行 chown -R www-data:www-data /vol/web/static 来实现这一点 (将 www-data 替换为你的 Nginx 用户)。
  • 在部署更改后,重启 Nginx ( sudo service nginx restart ) 以加载新的配置。
  • 为了更好地调试,可以查看 Nginx 错误日志,看看是否有其他错误信息。

希望这些信息能帮助你解决问题!

标签:python,reactjs,django,docker,nginx
From: 78802454

相关文章

  • Python 中的“样板”代码?
    Google有一个Python教程,他们将样板代码描述为“不幸的”,并提供了以下示例:#!/usr/bin/python#importmodulesusedhere--sysisaverystandardoneimportsys#Gatherourcodeinamain()functiondefmain():print'Hellothere',sys.argv[1]#Command......
  • Python 3.9.1 中的 collections.abc.Callable 是否有 bug?
    Python3.9包含PEP585并弃用typing模块中的许多类型,转而支持collections.abc中的类型,现在它们支持__class_getitem__例如Callable就是这种情况。对我来说,typing.Callable和collections.abc.Ca......
  • 列表子类的 Python 类型
    我希望能够定义列表子类的内容必须是什么。该类如下所示。classA(list):def__init__(self):list.__init__(self)我想包含键入内容,以便发生以下情况。importtypingclassA(list:typing.List[str]):#Maybesomethinglikethisdef__init__(self):......
  • Python 中类型友好的委托
    考虑以下代码示例defsum(a:int,b:int):returna+bdefwrap(*args,**kwargs):#delegatetosumreturnsum(*args,**kwargs)该代码运行良好,只是类型提示丢失了。在Python中使用*args,**kwargs来实现​​委托模式是很常见的。如果有一种方法可......
  • 使用 python 支持构建自定义 vim 二进制文件
    背景Debian11vim软件包不包含python3支持。请参阅标题为“Debian11vim中不支持python-证据”的部分下面我需要vim支持python3YouCompleteMevim插件为了构建一个新的,我将vim9.0tarball下载到v......
  • 如何在Python 3.12+中正确使用泛型来提高代码质量?
    我正在尝试使用泛型来改进FastAPI应用程序中的类型注释。我有一个抽象存储库类,在其中使用泛型:fromabcimportABC,abstractmethodfromtypingimportListclassAbstractRepository[T](ABC):@abstractmethodasyncdefadd_one(self,data:dict)->T:......
  • python中的while循环不退出
    我试图完成第一年的python商业课程作业,但我的while循环无法退出,有人能帮忙吗?commisionTable=[{"admin_fee":100,"comm_rate":0.10},{"admin_fee":125,"comm_rate":0.12},{"admin_fee":150,"comm_rate":......
  • python---json文件写入
    ​ 使用到的知识点:os模块执行linux指令、json.dump()、withopenasf代码实现importsysimportosimportjson #向json文件file中添加内容data,其中data的类型为字典defwrite_json(file,data):    #如果文件存在,则删除    if(os.path.exists(fi......
  • python错题记录:布尔运算与逻辑值检测
    一前言环境:python3.10win10二布尔运算与逻辑值检测1案例案例1如上,在布尔运算时,有些时候代码只会运算前面的一部分,剩下的部分根本不会运算。以前在练习算法代码时,就利用这个规则来减少代码的工作量案例2如上,之前好长一段时间,上面的布尔运算总是让我感到困惑布尔运......
  • python---字典遍历
    1、三种常见的字典遍历实现defget_key_value(dics):  '''遍历所有键值对'''  forkey,valueindics.items():    print(f"{key}:{value}")defget_keys(dics):  '''遍历所有的键'''  forkeyindics......