Jac*_*son 4 python django static-files python-3.x
通常我有这个问题正好相反!
在我的开发环境中,我的 Django 应用程序不会加载我的一些静态文件,特别是我自己添加的那些:也就是说,我添加到我的应用程序中的两个包(admin和ckeditor)都加载良好,但其中两个找不到我自己创建和链接的文件夹(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
Run Code Online (Sandbox Code Playgroud)
如前所述,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
Run Code Online (Sandbox Code Playgroud)
以下是一些您可能感兴趣的其他信息:
admin和ckeditor工作。{% load static %}按照 Django 文档的指示使用模板标签。在我使用的旧版本中{% load staticfiles %},我也尝试过。collectstatic在这两种环境中都运行过。DEBUG=False在生产中运行正常(加载所有静态文件),但DEBUG=False在开发中根本没有加载静态文件。这是意料之中的,因为在开发中我没有网络服务器来处理这个问题(澄清一下,我通常在调试模式下运行服务器,但已经尝试关闭和打开此设置以查看发生了什么变化)为了帮助任何人调试我的问题,这里有一些相关的摘录文件:
设置.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/'
Run Code Online (Sandbox Code Playgroud)
网址.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)
Run Code Online (Sandbox Code Playgroud)
这是在 django 中处理静态文件的一种简单方法(如果您使用 Django 默认选项,则可以直接使用):
STATIC_ROOT。static内的文件夹中。static_files在您的项目中创建文件夹并添加到您的设置中:STATICFILES_DIRS = [os.path.join(BASE_DIR, 'static_files'),]. 显然你可以选择另一个名字,static_files这只是一个建议。collectstatic以便 Django 收集您的静态文件(从第 2 点和第 3 点开始)并将它们放入您在 1 中创建的文件夹中。如果您处于调试模式,则在第 3 步之后就完成了。
在您的情况下,问题在于您将静态内容放入STATIC_ROOTDjango 不会在调试模式下查找内容的文件夹中。
admin并且ckeditor因为它们遵循第 2 步而工作,因此它们的静态文件实际上来自已安装应用程序的文件夹,而不是static在调试模式下来自您的文件夹。
因此,这是解决您的问题的方法:
img,并css在第3步中创建的文件夹。STATIC_ROOT文件夹。由于您'django.contrib.staticfiles'的应用程序列表中有,当 DEBUG 为 True 时,Django 实际上不会从 STATIC_ROOT 加载文件。
当启用 DEBUG 时,Django 使用 STATICFILES_FINDERS 选项,默认情况下是:
[
'django.contrib.staticfiles.finders.FileSystemFinder',
'django.contrib.staticfiles.finders.AppDirectoriesFinder',
]
Run Code Online (Sandbox Code Playgroud)
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'),
]
Run Code Online (Sandbox Code Playgroud)
您还可以删除其中的所有文件,/root/static/无需手动在此文件夹中创建任何内容,collectstatic将在生产过程中自动执行此操作。
| 归档时间: |
|
| 查看次数: |
1489 次 |
| 最近记录: |