Python Django中的STATIC_URL 设置和使用方式


Posted in Python onMarch 27, 2020

使用Django静态设置时,遇到很多问题,经过艰苦的Baidu, stack overflow, Django原档阅读,终于把静态图片给搞出来了。特记录下来。

关键的概念:Django中,静态资源的存放通过设置 STATIC_URL, STATICFILES_DIRS 来设置,一般STATIC_URL设置为:/static/

STATIC_URL='/static/', 这个static 是在Django 具体APP下建立的static目录,用来存放静态资源。而STATICFILES_DIRS一般用来设置通用的静态资源,对应的目录不放在APP下,而是放在Project下,例如:

STATICFILES_DIRS=(os.path.join(BASE_DIR, "common_static"),)

具体在模板文件中访问的时候,都是统一用:/static/资源名的方式,就可以访问到资源,不论具体的目录是APP下的static,还是project下的common_static, 都可以用/static/资源名的方式访问到。

为增强可移植性,在模板中可以用:STATIC_URL来代替具体的/static/来设置资源路径,但是需要在settings.py中2个地方进行设置,否则会发生取不到资源的错误:

1. INSTALLED_APPS 中,加入 'django.contrib.staticfiles'

2. TEMPLATES 中,context_processors中,加入django.template.context_processors.static

模板中调用时:

<img src="{{STATIC_URL}}pic.jpg " />

补充知识:Django中static(静态)文件详解以及{% static %}标签的使用

在一个网页中,不仅仅只有一个html骨架,还需要css样式文件,js执行文件以及一些图片等。因此在DTL中加载静态文件是一个必须要解决的问题。在DTL中,使用static标签来加载静态文件。要使用static标签,首先需要{% load static %}。

加载静态文件的步骤如下:

首先确保django.contrib.staticfiles已经添加到settings.INSTALLED_APPS中。

确保在settings.py中设置了STATIC_URL。

注意: 上面两条都是在创建Django 项目的时候就自动给我们弄好了,只要我们没有去改动它,就不用管。

在已经安装了的app下创建一个文件夹叫做static,然后再在这个static文件夹下创建一个当前app的名字的文件夹,再把静态文件放到这个文件夹下。例如你的app叫做book,有一个静态文件叫做book.jpg,那么路径为book/static/book/book.jpg。

(为什么在app下创建一个static文件夹,还需要在这个static下创建一个同app名字的文件夹呢?原因是如果直接把静态文件放在static文件夹下,那么在模版加载静态文件的时候就是使用book.jpg,如果在多个app之间有同名的静态文件,这时候可能就会产生混淆。而在static文件夹下加了一个同名app文件夹,在模版中加载的时候就是使用app名/book.jpg,这样就可以避免产生混淆。)

注意: 文件夹的名字必须为static 。

如果有一些静态文件是不和任何app挂钩的。即不再任何一个app的目录下。那么可以在settings.py中添加STATICFILES_DIRS,以后DTL就会在这个列表的路径中查找静态文件。例如我们在manage.py的同级目录下新建一个static的文件夹。然后在settings.py:中添加STATICFILES_DIRS

STATICFILES_DIRS = [
 os.path.join(BASE_DIR,"static")
]

注:第三种和第四种方法都可以加载静态文件,我的个人习惯是在manage.py的同级目录下新建一个static文件夹,然后将所有的静态文件进行分类的在里面存储。而不去app中新建一个static的文件夹。但这只是我的个人习惯。毕竟不管是黑猫白猫,能抓到老鼠的就是好猫,所以只要我们能把项目做出来能运行,并且代码结构有逻辑性、层次感就行了。

在模版中使用load标签加载static标签。比如要加载在项目的static文件夹下的style.css的文件。那么示例代码如下:

{% load static %}

<link rel="stylesheet" href="{% static 'style.css' %}" rel="external nofollow" >

注意: {% load static %}需要放在html的头部位置(至少在使用static标签的上面),一般都是放在html的最上面。如果{% extend %}标签和{% load static %}同时存在,{% extend %}需要放在最上面,然后再放{% load static %}等标签。

如果不想每次在模版中加载静态文件都使用load加载static标签,那么可以在settings.py中的TEMPLATES/OPTIONS添加'builtins':[‘django.templatetags.static'],这样以后在模版中就可以直接使用static标签,而不用手动的load了。

注意: 位置不要添加错误了

TEMPLATES = [
 {
  'BACKEND': 'django.template.backends.django.DjangoTemplates',
  'DIRS': [os.path.join(BASE_DIR, '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'
   ],
  },
 },
]

下面的不常用,但是可以了解一下。

如果没有在settings.INSTALLED_APPS中添加django.contrib.staticfiles。那么我们就需要手动的将请求静态文件的url与静态文件的路径进行映射了。示例代码如下:

from django.conf import settings
from django.conf.urls.static import static

urlpatterns = [
 # 其他的url映射
] + static(settings.STATIC_URL, document_root=settings.STATIC_ROOT)

但平时我们并不会用到这个,Django内置已经将django.contrib.staticfiles添加进去了的,我们为什么要给他删除来自找麻烦呢?放在这里也只是提供一个参考,了解一下。

最后分享一个快捷键的使用:在我们写项目的时候,有时候修改了代码而没有效果,这是因为浏览器使用的缓存加载,这个时候我们就可以使用这个快捷键来不使用缓存加载一个文件,来达到查看修改代码之后的效果的目地。

ctrl+shift+r 不使用缓存加载一个文件

以上这篇Python Django中的STATIC_URL 设置和使用方式就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持三水点靠木。

Python 相关文章推荐
python生成随机密码或随机字符串的方法
Jul 03 Python
python的Crypto模块实现AES加密实例代码
Jan 22 Python
python在非root权限下的安装方法
Jan 23 Python
python实现多人聊天室
Mar 31 Python
Python3字符串encode与decode的讲解
Apr 02 Python
记一次pyinstaller打包pygame项目为exe的过程(带图片)
Mar 02 Python
使用python实现CGI环境搭建过程解析
Apr 28 Python
使用python创建Excel工作簿及工作表过程图解
May 27 Python
Android Q之气泡弹窗的实现示例
Jun 23 Python
手把手教你如何用Pycharm2020.1.1配置远程连接的详细步骤
Aug 07 Python
Python+Selenium实现自动化的环境搭建的步骤(图文)
Sep 01 Python
python爬虫利用selenium实现自动翻页爬取某鱼数据的思路详解
Dec 22 Python
Python爬虫爬取、解析数据操作示例
Mar 27 #Python
python opencv进行图像拼接
Mar 27 #Python
Python爬虫爬取电影票房数据及图表展示操作示例
Mar 27 #Python
Pyspark读取parquet数据过程解析
Mar 27 #Python
Python基于pyecharts实现关联图绘制
Mar 27 #Python
Python爬虫爬取杭州24时温度并展示操作示例
Mar 27 #Python
Django添加bootstrap框架时无法加载静态文件的解决方式
Mar 27 #Python
You might like
PHP 杂谈《重构-改善既有代码的设计》之一 重新组织你的函数
2012/04/09 PHP
phpize的深入理解
2013/06/03 PHP
PHP如何利用P3P实现跨域
2013/08/24 PHP
php给每个段落添加空格的方法
2015/03/20 PHP
php使用GD2绘制几何图形示例
2017/02/15 PHP
PHP面向对象五大原则之单一职责原则(SRP)详解
2018/04/04 PHP
使用laravel和ajax实现整个页面无刷新的操作方法
2019/10/03 PHP
PHP 枚举类型的管理与设计知识点总结
2020/02/13 PHP
javascript Discuz代码中的msn聊天小功能
2008/05/25 Javascript
js 禁用只读文本框获得焦点时的退格键
2010/04/25 Javascript
javascript中window.event事件用法详解
2012/12/11 Javascript
jquery实现类似淘宝星星评分功能有截图
2014/09/15 Javascript
使用javascript实现json数据以csv格式下载
2015/01/09 Javascript
jQuery实现向下滑出的二级菜单效果实例
2015/08/22 Javascript
AngularJS入门教程之AngularJS表达式
2016/04/18 Javascript
原生JS实现网络彩票投注效果
2016/09/25 Javascript
JavaScript 函数节流详解及方法总结
2017/02/09 Javascript
JS判断一个数是否是水仙花数
2017/06/11 Javascript
一步步教你利用webpack如何搭一个vue脚手架(超详细讲解和注释)
2018/01/08 Javascript
详解swiper在vue中的应用(以3.0为例)
2018/09/20 Javascript
JS中FormData类实现文件上传
2020/03/27 Javascript
JS实现斐波那契数列的五种方式(小结)
2020/09/09 Javascript
[58:12]Ti4第二日主赛事败者组 LGD vs iG 3
2014/07/21 DOTA
[02:17]2016国际邀请赛中国区预选赛VG战队领队采访
2016/06/26 DOTA
python从入门到精通(DAY 3)
2015/12/20 Python
python中os和sys模块的区别与常用方法总结
2017/11/14 Python
pandas的object对象转时间对象的方法
2018/04/11 Python
在python 不同时区之间的差值与转换方法
2019/01/14 Python
Python使用pymongo库操作MongoDB数据库的方法实例
2019/02/22 Python
Python利用FFT进行简单滤波的实现
2020/02/26 Python
python与c语言的语法有哪些不一样的
2020/09/13 Python
策划助理岗位职责
2013/11/18 职场文书
初中生学习生活的自我评价
2013/11/20 职场文书
大学生第一学年自我鉴定2015
2014/09/28 职场文书
党员剖析材料范文
2014/12/18 职场文书
甜美蛋糕店的创业计划书模板,拿来即用!
2019/08/21 职场文书