首页 > 解决方案 > 在生产中加载静态文件,但在开发中不加载

问题描述

通常我有这个问题正好相反!

在我的开发环境中,我的 Django 应用程序不会加载我的一些静态文件,特别是我自己添加的那些:也就是说,我添加到我的应用程序的两个包 (adminckeditor) 都可以正常加载,但是其中两个找不到我自己创建和链接的文件夹(img和)。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存在于我的文件树中):

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

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

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

设置.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/'

网址.py

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)

标签: pythonpython-3.xdjangostatic-files

解决方案


这是在 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_ROOTDjango 不会在调试模式下查找内容的文件夹中。 admin并且ckeditor可以工作,因为它们遵循第 2 步,因此它们的静态文件实际上来自已安装应用程序的文件夹,而不是static在调试模式下来自您的文件夹。


所以,这里是如何解决你的问题

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

推荐阅读