视频加载失败

Django的静态文件

1170 字
6 分钟
Django的静态文件

【一】Django有两种静态文件#

【1】static#

  • 称为静态文件夹,是不变的,形成网站的核心部件
  • 如 CSS文件,JS文件,背景图片等
  • 可为Templates模板提供支持

【2】media#

  • 称为媒体文件夹,是变动的,由用户定义的文件
  • 如 用户头像, 用户上传的图片或视频等;
  • 可为富文本编辑器mdeditor提供支持

【二】前言#

  • 我要做的是个人博客,不提供其他人注册登录功能,故media只是为了存放文章的封面、图片等信息。
  • 故在目录方面,我的设置如下:
  • static目录与Templates目录放在一起,由“主题目录接管”
  • 主题目录:与manage.py同级目录下创建templates目录,目录下创建主题文件夹,如default,里面创建templates和static静态文件夹
  • 如果想更换主题,只需创建新主题文件夹,变动templates和static即可
  • media目录放在根目录,毕竟我的“主题”无论怎么换,博客文章内容不会换,涉及的本地图片不会变动

【三】配置说明(static)#

【1】引入#

  • http://127.0.0.1:8000/static-files/
  • Django的静态文件处理一般分debug模式和非debug模式
  • debug模式的情况下允许访问静态资源,无需STATIC_ROOT
  • 非debug模式也就是生产模式,在服务器运行时, 静态资源需要使用nginx或者apache之类的工具维护

【2】配置解释#

  • STATIC_URL - 可以理解为通过url访问static文件的路径
  • STATIC_ROOT - 可以理解为你打算在服务器上存储static文件的路径(通过 python manage.py collectstatic命令)
    • collectstatic命令后将复制静态文件到STATIC_ROOT指定的目录中,
    • 部署django项目的时候需要
  • STATICFILES_DIRS - 可以理解为配置Django寻找静态文件时首先去STATICFILES_DIRS里面寻找, 其次再到各个app的static文件夹里面找
    • Django查找静态文件是惰性查找
    • 查找到第一个,就停止查找了
  • django放置静态文件有两种方式
    • 一是在每个app里新建一个static目录,将静态文件放置其中;
    • 另一种是对公共文件的处理,如jQuery bootstrap等,这时就需要配置 STATICFILES_DIRS。

【三】配置文件修改(static)#

【1】debug模式#

  • 确定主题目录/templates/default/,创建static文件夹
# debug模式在settings中进行设置
# 对外提供WEB访问时的URL地址
STATIC_URL = '/static/'
# 开发阶段放置项目自己的静态文件,不能包含STATIC_ROOT路径
STATICFILES_DIRS = [
os.path.join(BASE_DIR, 'templates', THEME, 'static'),
]

【2】非debug模式#

# 在`settings.py`同级的`urls.py`内还需要把`STATIC_URL`和django的url连接起来
from django.contrib.staticfiles.urls import staticfiles_urlpatterns
urlpatterns += staticfiles_urlpatterns()
# 非debug模式在settings中进行设置,需要修改
STATIC_URL = '/static/'
# 执行collectstatic命令后会将项目中的静态文件(包括STATICFILES_DIRS、自带admin的静态文件)收集到该目录下面来(所以不应该在该目录下面放置自己的一些静态文件,因为会覆盖掉)
STATICFILES_DIRS = (
os.path.join(BASE_DIR, 'collect_static'),
)

【3】模板中使用静态文件#

  • {%load static%}和{%load staticfiles%}:哪个是首选?
  • Django2.x之后废弃{%load staticfiles%}语法
{% load static %}
<img src="{% static "my_app/example.jpg" %}" alt="My image"/>

【4】全局配置#

  • 模板中使用静态文件,无需load static,配置全局使用load static
  • TEMPLATES加入’builtins’: [‘django.templatetags.static’]
TEMPLATES = [
{
'BACKEND': 'django.template.backends.django.DjangoTemplates',
'DIRS': [os.path.join(BASE_DIR, 'templates', THEME, 'templates')],
'APP_DIRS': True,
'OPTIONS': {
'context_processors': [
'django.template.context_processors.debug',
'django.template.context_processors.request',
'django.contrib.auth.context_processors.auth',
'django.contrib.messages.context_processors.messages',
],
'builtins': ['django.templatetags.static']
},
},
]

【四】配置文件说明(media)#

  • MEDIA_ROOT - 设置用户上传文件的实际保存目录,该文件夹自动创建
  • MEDIA_URL - 代表用户通过URL来访问这个本地地址的URL

【五】配置文件修改(media)#

【1】配置文件注册#

# 在根目录下的 settings.py 中添加如下配置
MEDIA_URL='/media/'
MEDIA_ROOT=os.path.join(BASE_DIR,"media")

【2】路由映射#

# 导入项目文件夹中settings.py模块
# 或者 from . import settings
from django.conf import settings
# 导入相关静态文件处理的views控制包
from django.views.static import serve
urlpatterns = [
re_path('media/(?P<path>.*)$', serve, {'document_root': MEDIA_ROOT}),
]

【3】模型文件配置#

  • FileField或ImageField字段适用于存储文件/图片
  • 出于性能考虑,文件并不直接保存到数据库,而是保存在文件系统里,因此该字段只是记录一个路径而已。
img_link = models.ImageField(upload_to='images/%Y-%m', max_length=255,
help_text='提示:不添加封面可以不选择图片,默认没有图片',
blank=True, null=True, verbose_name='文章封面')
# upload_to相当于上传到/media/images目录下,格式为year-month,如2019-10
avatar = models.FileField(verbose_name='头像', upload_to='upload/avatar/')
# upload_to相当于上传到/media/upload/avatar/目录下

【4】模版文件使用#

【1】方式一#

<img src="/media/{{ article.img_link }}">

【2】方式二#

<img src="{{ article.img_link.url }}">

支持与分享

如果这篇文章对你有帮助,欢迎分享给更多人或打赏支持!

打赏
Profile Image of the Author
Dream
Hello, I'm Dream.
公告
欢迎来到我的博客!爱学习爱进步。
分类
标签
最新动态
站点统计
文章
300
分类
5
标签
26
总字数
640,882
运行时长
0 天
最后活动
0 天前
站点信息
构建平台
Vercel
博客版本
Firefly v6.16.8
文章许可
CC BY-NC-SA 4.0
文章目录