【问题标题】:static files don't visable in production | DJANGO静态文件在生产中不可见 | DJANGO
【发布时间】:2018-07-26 13:39:46
【问题描述】:

我有点困惑。我在我的项目中使用django-el-pagination 应用程序。此应用在模板中使用下一个 javascript:

<script src="{% static 'el-pagination/js/el-pagination.js'%}"></script>

在 django 开发服务器中完美运行,但在生产中显示 404。

在生产中我安装了这个应用程序。在我的settings.py 文件下面:

DEBUG = True

MIDDLEWARE = [
    'django.middleware.security.SecurityMiddleware',
    'django.contrib.sessions.middleware.SessionMiddleware',
    'django.middleware.common.CommonMiddleware',
    'django.middleware.csrf.CsrfViewMiddleware',
    'django.contrib.auth.middleware.AuthenticationMiddleware',
    'django.contrib.messages.middleware.MessageMiddleware',
    'django.middleware.clickjacking.XFrameOptionsMiddleware',
]

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

STATICFILES_DIRS = [os.path.join(BASE_DIR, 'static')]
STATIC_URL = '/static/'
STATIC_ROOT = os.path.join(BASE_DIR, 'static_root')

我也做了python manage.py collectstatic 命令。我忘了做什么?

【问题讨论】:

  • 你的部署方式是什么?
  • @misraX 我用更详细的设置更新了我的帖子。你现在可以检查一下吗?
  • 这仍然没有说明您如何在生产中部署它。您是在生产中使用python manage.py runserver,还是使用 Apache/mod_wsgi、nginx/uWSGI、gunicorn 或其他?
  • 在生产中我使用nginx + gunicorn + supervisor stack。
  • 那么你可能需要展示你是如何配置 nginx 来提供静态文件的,因为 gunicorn 不会为你做这件事。让 gunicorn 为您做这件事的唯一方法是使用 WhiteNoise 中间件。

标签: python django python-2.7 django-1.11


【解决方案1】:

来自the documentation

在开发过程中,如果你使用 django.contrib.staticfiles,这将 当 DEBUG 设置为 True 时由 runserver 自动完成(参见 django.contrib.staticfiles.views.serve())。

因此,如果您不使用runserver,并且如果DEBUG 设置为False,则不应提供这些文件。

无论如何,如果您也从同一文档中考虑这一点:

此方法效率极低且可能不安全,因此不适合生产。

这里有some suggested ways 在生产环境中提供静态文件,例如链接的一个是关于通过您的反向代理服务器(例如 nginx 或 apache)提供静态文件。

【讨论】:

  • 要解决这个问题,如果您不想处理 nginx 或 apache,whitenoise 是一种很好的简单方法来获取静态文件。 whitenoise.evans.io/en/stable
  • 我用更详细的设置更新我的帖子。我也使用 nginx gunicorn 主管堆栈。如果我只是在生产中更改为DEBUG = False,就足够了吗?!我必须更多地考虑什么?
  • @NurzhanNogerbek 你必须配置 nginx 来提供这些文件。我添加了一个链接。
【解决方案2】:

这通常发生在生产服务器上。您可以从生产服务器访问静态文件

<script src="https://techoryze.herokuapp.com/static/js/jquery.js" />

【讨论】:

  • 硬编码静态 url 并不理想或最佳实践,如果您更改域怎么办,如果您想在另一个项目中重用您的应用程序怎么办,,,如果...等等,所有硬编码的静态数据将毫无用处。
猜你喜欢
  • 2014-09-11
  • 2018-09-25
  • 2017-03-05
  • 2015-06-19
  • 2017-12-30
  • 1970-01-01
  • 1970-01-01
  • 2015-08-22
  • 1970-01-01
相关资源
最近更新 更多