Django 2.1静态文件加载生产但不开发

问题描述 投票:4回答:4

通常我反正这个问题!

在我的开发环境中,我的Django应用程序不会加载我的一些静态文件,特别是我自己添加的文件:也就是说,我添加到我的应用程序中的两个软件包(adminckeditor)都装得很好,但是两个没有找到我自己创建和链接的文件夹(imgcss)。这是我的目录的地图:

root
 |-- blog    (this is the name of my app)
 |-- mysite  (name of my site)
      |-- settings.py
      |-- urls.py
 |-- media
 |-- static
      |-- admin
      |-- ckeditor
      |-- css
      |-- img

如上所述,ckeditoradmin负载罚款而其他人没有。以下是调试模式下runserver输出的示例(static/css/base.css中的文件存在于我的文件树中):

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

以下是一些可能感兴趣的其他信息:

  • 它在生产中工作正常!我认为这是因为我在apache配置中有专用别名,但这并不能解释为什么adminckeditor工作。
  • 我以相同的方式路由媒体(请参阅下面的设置文件),这在开发中运行良好。
  • 我按照Django文档的指示使用模板标签{% load static %}。在旧版本中,我使用了{% load staticfiles %},我也尝试过。
  • 我在两种环境中都运行了collectstatic
  • 使用DEBUG=False运行在生产中工作正常(所有静态文件加载)但在开发中DEBUG=False时根本没有加载静态文件。这是可以预料到的,因为在开发中我没有Web服务器来处理这个问题(为了澄清,我通常在调试模式下运行服务器,但是尝试关闭此设置以查看发生了哪些更改)

为了帮助任何人调试我的问题,这里有一些相关的摘录文件:

settings.朋友

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/'

URLs.朋友

from django.contrib import admin
from django.urls import path, include
from django.conf import settings
from django.conf.urls.static import static

urlpatterns = [
    path('', include('blog.urls')),
    path('admin/', admin.site.urls),
    path('ckeditor', include('ckeditor_uploader.urls')),
]
urlpatterns += static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT)
urlpatterns += static(settings.STATIC_URL, document_root=settings.STATIC_ROOT)
django python-3.x static-files
4个回答
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文件夹。相反,它从应用程序static子目录获取AppDirectoriesFinder的文件。像... / 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会自动进行生产。


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
投票

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

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

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

BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))

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/'
© www.soinside.com 2019 - 2024. All rights reserved.