python - 在生产中加载静态文件,但在开发中不加载
问题描述
通常我有这个问题正好相反!
在我的开发环境中,我的 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
如前所述,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
以下是一些可能感兴趣的其他信息:
- 它在生产中运行良好!我认为这是因为我的 apache 配置中有专用别名,但这并不能解释原因
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/'
网址.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)
解决方案
这是在 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_ROOT
Django 不会在调试模式下查找内容的文件夹中。
admin
并且ckeditor
可以工作,因为它们遵循第 2 步,因此它们的静态文件实际上来自已安装应用程序的文件夹,而不是static
在调试模式下来自您的文件夹。
所以,这里是如何解决你的问题:
- 从上面执行第 3 步。
- 将您的文件夹移动
img
到css
第 3 步中创建的文件夹。 - (可选)擦除您的
STATIC_ROOT
文件夹。
推荐阅读
- delphi - 应用程序在目标计算机上产生异常
- python - 在 Raspberry Pi 上通过 OpenCV 编写的视频未运行
- html - 如何正确设置 svg 图案大小?
- python - Python将列表值分别分配给新变量
- python - 给出某个星形直方图的函数
- sql - SQL case - else 条件即使在其他条件为真时也已访问
- python - pandas duplicated() 在一种情况下返回列值,在另一种情况下返回索引值
- matlab - 使用倒数矩阵算法编写 MATLAB 代码
- plc - 从 Codesys (ABB AC500 PLC) 访问 PLC 元数据
- javascript - 无法通过 javascript CSS 重置按钮颜色