在生产环境中加载Django 2.1静态文件但未在开发中加载

时间:2019-03-03 19:31:08

标签: django python-3.x static-files

通常,我恰恰相反地遇到了这个问题!

在开发环境中,我的Django应用程序不会加载某些静态文件,尤其是我自己添加的静态文件:即,我添加到应用程序中的两个软件包(admin和{{1 }})都可以正常加载,但是找不到我创建和链接的两个文件夹(ckeditorimg)。这是我的目录的地图:

css

如前所述,root |-- blog (this is the name of my app) |-- mysite (name of my site) |-- settings.py |-- urls.py |-- media |-- static |-- admin |-- ckeditor |-- css |-- img ckeditor可以很好地加载,而其他则不能。这是来自调试模式下admin输出的示例(runserver中的文件存在于我的文件树中):

static/css/base.css

还有一些其他有趣的信息:

  • 在生产中效果很好!我以为这是因为我在apache配置中有专用的别名,但这并不能解释为什么GET /static/ckeditor/ckeditor/ckeditor.js HTTP/1.1" 200 690627 GET /static/admin/css/fonts.css HTTP/1.1" 200 423 GET /static/admin/css/widgets.css HTTP/1.1" 200 10340 GET /static/css/base.css HTTP/1.1" 404 1761 GET /static/img/brand.png HTTP/1.1" 404 1764 admin可以工作。
  • 我以几乎相同的方式路由媒体(请参阅下面的设置文件),并且在开发中效果很好。
  • 我正在按照Django文档的指示使用模板标签ckeditor。在较旧的版本中,我使用了{% load static %},我也尝试过。
  • 我在两种环境中都运行过{% load staticfiles %}
  • 使用collectstatic运行在生产中运行良好(所有静态文件都已加载),但是在开发DEBUG=False时根本没有静态文件加载。不过,这是可以预料的,因为在开发中我没有Web服务器来处理此问题(为澄清起见,我通常在调试模式下运行服务器,但尝试关闭此设置然后再将其打开看看发生了什么变化)

为帮助任何人调试我的问题,以下是一些相关的摘录文件:

settings.py

DEBUG=False

urls.py

DEBUG = True
BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
...
INSTALLED_APPS = [
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
    'blog',
    'ckeditor',
    'ckeditor_uploader',
]
...
STATIC_ROOT = os.path.join(BASE_DIR, 'static')
STATIC_URL = '/static/'
MEDIA_ROOT = os.path.join(BASE_DIR, 'media')
MEDIA_URL = '/media/'

4 个答案:

答案 0 :(得分:3)

这是在django中处理静态文件的简单方法(如果使用Django默认选项,则开箱即用):

  1. 永远不要将任何东西放入指定为STATIC_ROOT 的文件夹中。
  2. 将特定于应用程序的静态文件放入应用程序内的文件夹static中。
  3. 对于不直接属于应用程序的静态文件,请在项目中创建文件夹static_files,然后将其添加到设置中:STATICFILES_DIRS = [os.path.join(BASE_DIR, 'static_files'),]很明显,您可以选择其他名称,static_files只是一个建议。
  4. 用于生产,运行collectstatic,以便Django收集您的静态文件(从第2点和第3点开始),并将它们放入您在1.中创建的文件夹中。

如果您处于调试模式,请在步骤3之后完成。


在您的情况下,问题在于您将静态内容放入了STATIC_ROOT,这是Django在调试模式下不会查找内容的文件夹。 adminckeditor之所以起作用,是因为它们遵循步骤2。因此,在调试模式下,它们的静态文件实际上来自安装的应用程序的文件夹,而不是来自您的static文件夹。


因此,这是解决问题的方法

  • 从上方执行步骤3。
  • 将文件夹imgcss移至步骤3中创建的文件夹。
  • (可选)擦除您的STATIC_ROOT文件夹。

答案 1 :(得分:2)

由于您的应用列表中有'django.contrib.staticfiles',因此当DEBUG为True时,Django实际上不会从STATIC_ROOT加载文件。

启用DEBUG时,Django使用STATICFILES_FINDERS选项,默认情况下为:

[
'django.contrib.staticfiles.finders.FileSystemFinder',
'django.contrib.staticfiles.finders.AppDirectoriesFinder',
]

FileSystemFinder将查找存储在STATICFILES_DIRS设置中的文件 AppDirectoriesFinder会在每个应用程序的static子目录中查找文件。

这就是文件夹admin和ckeditor起作用的原因-当DEBUG为True时,Django根本不使用您的/ root / static文件夹。而是通过AppDirectoriesFinder从应用程序static子目录中获取文件。 类似于... / 3.5 / lib / python3.5 / site-packages / django-ckeditor / static /...

当您运行collectstatic命令时,它将收集STATICFILES_FINDERS可以找到的所有静态文件,并将其复制到您的STATIC_ROOT(/ root / static /)中;如果DEBUG为False,则Django仅使用此文件夹而不是STATICFILES_FINDERS

因此,如何使它在启用调试的情况下工作。只需创建一个文件夹,然后将其添加到STATICFILES_DIRS即可,

STATICFILES_DIRS = [
    os.path.join(BASE_DIR, 'some_new_static_folder'),
]

您还可以从/root/static/中删除所有文件,而无需手动在此文件夹中创建任何内容,collectstatic会自动将其用于生产。

答案 2 :(得分:1)

您的urlpatterns是正确的,这意味着问题很可能是设置文件中的settings.DEBUG = False。确保settings.DEBUGTrue,并且应该加载静态文件。您可以使用manage.py shell并检查DEBUG标志的值来验证这一点。

要查找的唯一其他问题是,通过验证ROOT_URLCONF设置是否指向设置中的正确urls文件,以及BASE_DIR是否指向{{1 }} 目录。这两个值也可以在static中进行验证。

例如,如果您的设置文件位于shell中,则将/path/to/root/blog/settings.py设置为:

BASE_DIR

答案 3 :(得分:1)

我在本地文件方面也遇到了一些问题,这对我的情况有所帮助。

我确实将静态文件存储在S3上,但是您可以调整图像位置URL。

if DEBUG == False:
    STATICFILES_LOCATION = 'static'
    STATIC_URL = "//%s/%s/" % (AWS_S3_CUSTOM_DOMAIN, STATICFILES_LOCATION)
    MEDIAFILES_LOCATION = 'media'
    MEDIA_URL = "//%s/%s/" % (AWS_S3_CUSTOM_DOMAIN, MEDIAFILES_LOCATION)
else:
    MEDIA_URL = '/media/'
    STATIC_URL = '/static/'