对于django静态文件的使用,如果开发过netcore程序的开发人员,可能会比较容易理解django关于静态文件访问的设计原理,个人觉得,这是一个middlerware的设计,但是在django中我们在配置中看到,他其实并不是放在middleware中配置的,反倒变成了一个app。

一 。先来看看关于static静态文件的搜索原理以及为什么默认可以找到static文件夹下的静态文件 

<link rel="stylesheet" type="text/css" href="{% static 'polls/css/polls.css' %}"/>

按住ctrl+鼠标左键,pycharm会帮你导航到 

load static  这个指令是通过: django/templatetags/static.py 来加载配置中的静态文件的目录的,具体是通过这个源码来实现的:

class ConfiguredStorage(LazyObject):
def _setup(self):
self._wrapped = get_storage_class(settings.STATICFILES_STORAGE)() staticfiles_storage = ConfiguredStorage()
settings.STATICFILES_STORAGE 可以查看global_setting.py来找到配置,如果project的setting.py没有任何配置的话,而
global_setting.py是引用了 /django/contrib/staticfiles/finders.py 这个包的,在这个包里面,我们可以找到这个:
class AppDirectoriesFinder(BaseFinder):
"""
A static files finder that looks in the directory of each app as
specified in the source_dir attribute.
"""
storage_class = FileSystemStorage
source_dir = 'static' def __init__(self, app_names=None, *args, **kwargs):
# The list of apps that are handled
self.apps = []
# Mapping of app names to storage instances
self.storages = OrderedDict()
app_configs = apps.get_app_configs()
if app_names:
app_names = set(app_names)
app_configs = [ac for ac in app_configs if ac.name in app_names]
for app_config in app_configs:
app_storage = self.storage_class(
os.path.join(app_config.path, self.source_dir))
if os.path.isdir(app_storage.location):
self.storages[app_config.name] = app_storage
if app_config.name not in self.apps:
self.apps.append(app_config.name)
super().__init__(*args, **kwargs)
在这里,我们就知道为什么默认django会找这个static的目录去解析静态文件了

二。比如我们配置了 
STATIC_URL = '/staticsaaaa/'
STATIC_ROOT = os.path.join(BASE_DIR, 'statics')
STATICFILES_DIRS = (os.path.join(BASE_DIR, 'polls/staticpolls'),)
比如这样,那么,初始化的时候,静态文件的解析路径,将会按照 配置的格式来解析,可以看到,我在POLLS这个APP中,我故意将静态文件放在了staticpolls文件夹下,是这样的:

测试一下:

查看生成的链接,好了,现在按我们写的内容来显示链接地址了。
												

最新文章

  1. SQL --Chapter 04 数据更新
  2. Mysql table ful
  3. 查看Android系统当前运行的activity
  4. Android listview 禁止滑动
  5. 百度地图API的自动定位和搜索功能(移动端)
  6. 基于Azure blob storage T级别HBase表恢复
  7. ZOJ 3941 Kpop Music Party
  8. SpringMVC实现国际化过程中所遇问题
  9. WordPaster-UEditor1.x整合教程
  10. Java基础——泛型
  11. java 读写 excle 完整版
  12. python Thread对象的setDaemon(True)的作用。
  13. [Android教程] Cordova开发App入门(一)创建android项目
  14. [GO]conext的使用
  15. Unix系统编程()open,read,write和lseek的综合练习
  16. 判断当前VC 是push还是present的
  17. Kubernetes Metrics-Server
  18. mem_init()
  19. django 自定义过滤器中的坑.
  20. 【CF1016C】Vasya And The Mushrooms(模拟)

热门文章

  1. JVM虚拟机 - 内存
  2. #include stdio.h(1)
  3. 快速获取雪碧图的图标样式插件 - gulp-css-spriter教程
  4. SpringBoot的异步调用介绍
  5. 安装windows phone 7
  6. 服网LNMP集群 w/ MySQL PaaS-1.0
  7. HTML和CSS中一些有趣的
  8. HDU2433 最短路 + 剪枝优化
  9. pat乙级1034
  10. Sql Server配置管理器与 Sql Server Management Studio