Django 教程之media和static静态文件
区别Django有两种静态文件:static 称为静态文件夹,是不变的,形成网站的核心部件,如 CSS文件,JS文件,背景图片等;可为Templates模板提供支持media 称为媒体文件夹,是变动的,由用户定义的文件,如 用户头像, 用户上传的图片或视频等;可为富文本编辑器mdeditor提供支持配置说明我要做的是个人博客,不提供其他人注册登录功能,故media只是为了存放文章的封面、图片等信息
区别
Django有两种静态文件:
- static 称为静态文件夹,是不变的,形成网站的核心部件,如 CSS文件,JS文件,背景图片等;可为Templates模板提供支持
- media 称为媒体文件夹,是变动的,由用户定义的文件,如 用户头像, 用户上传的图片或视频等;可为富文本编辑器mdeditor提供支持
配置说明
我要做的是个人博客,不提供其他人注册登录功能,故media只是为了存放文章的封面、图片等信息。
故在目录方面,我的设置如下:
- static目录与Templates目录放在一起,由“主题目录接管”
- 主题目录:与manage.py同级目录下创建templates目录,目录下创建主题文件夹,如default,里面创建templates和static静态文件夹
- 如果想更换主题,只需创建新主题文件夹,变动templates和static即可
- media目录放在根目录,毕竟我的“主题”无论怎么换,博客文章内容不会换,涉及的本地图片不会变动
配置static目录
https://docs.djangoproject.com/en/1.11/howto/static-files/
Django的静态文件处理一般分debug模式和非debug模式
- debug模式的情况下允许访问静态资源,无需
STATIC_ROOT
- 非debug模式也就是生产模式,在服务器运行时, 静态资源需要使用nginx或者apache之类的工具维护
简单说下:
-
STATIC_URL
- 可以理解为通过url访问static文件的路径,如 项目路径是,{{projectName}}/static/common_static/test.css
则访问url是: http://IP/static/common_static/test.css
-
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。
配置方法:
-
确定主题目录`/templates/default/,创建static文件夹
-
debug模式在settings中进行设置
# 对外提供WEB访问时的URL地址 STATIC_URL = '/static/' # 开发阶段放置项目自己的静态文件,不能包含STATIC_ROOT路径 STATICFILES_DIRS = [ os.path.join(BASE_DIR, 'templates', THEME, 'static'), ]
-
非debug模式在settings中进行设置,需要修改
在`settings.py`同级的`urls.py`内还需要把`STATIC_URL`和django的url连接起来 from django.contrib.staticfiles.urls import staticfiles_urlpatterns urlpatterns += staticfiles_urlpatterns() STATIC_URL = '/static/' # 执行collectstatic命令后会将项目中的静态文件(包括STATICFILES_DIRS、自带admin的静态文件)收集到该目录下面来(所以不应该在该目录下面放置自己的一些静态文件,因为会覆盖掉) STATICFILES_DIRS = ( os.path.join(BASE_DIR, 'collect_static'), )
-
模板中使用静态文件,load static
{%load static%}和{%load staticfiles%}:哪个是首选?
https://stackoverflow.com/questions/34422971/load-static-and-load-staticfiles-which-is-preferred
{% load static %} <img src="{% static "my_app/example.jpg" %}" alt="My image"/>
-
模板中使用静态文件,无需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'] }, }, ]
使用,无需{% load static %},html中直接使用
<script src="{% static 'js_dist/jquery.min.js' %}"></script>
不能确实是不是需要引入这个需要修改
# from django.templatetags import static
``# 在模板中设置 static 后,以后在页面中使用
``# static 就不需要每个页面都使用 {% load static %}加
配置media目录
简单说下:
-
MEDIA_ROOT
- 设置用户上传文件的实际保存目录,该文件夹自动创建 -
MEDIA_URL
- 代表用户通过URL来访问这个本地地址的URL如 本机
MEDIA_URL
为”/media/”则访问url是: http://IP/media/***
配置方法:
-
settings.py进行设置
MEDIA_URL='/media/' MEDIA_ROOT=os.path.join(BASE_DIR,"media")
-
urls.py路由设置
from django.conf import settings # 导入项目文件夹中settings.py模块 # 或者 from . import settings from django.views.static import serve # 导入相关静态文件处理的views控制包 urlpatterns = [ url('media/(?P<path>.*)$', serve, {'document_root': MEDIA_ROOT}), ]
-
models.py模板设置
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/目录下
-
模板HTML中引用路径
-
方式一
<img src="/media/{{ article.img_link }}">
-
方式二
<img src="{{ article.img_link.url }}">
-
当前不知道以下设置的用途,用到再说:
-
TEMPLATES设置中的context_processor选项中加入:‘django.template.context_processors.media’, 据说是为了在html中引用{{ media_url }},会把media_url 注册到HTML
-
将media也加入静态文件目录列表中,STATICFILES_DIRS = [ os.path.join(BASE_DIR, ‘static’), os.path.join(BASE_DIR, ‘media’), ]
-
mdeditor貌似用到了。
在文件最后加上: +static(settings.MEDIA_URL,document_root=settings.MEDIA_ROOT)
即 urlpatterns += static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT)
开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!
更多推荐
所有评论(0)