Django settings 源码

  1. """
  2. 1.django其实有两个配置文件
  3. 一个是暴露给用户可以自定义的配置文件
  4. 项目根目录下的settings.py
  5. 一个是项目默认的配置文件
  6. 当用户不做任何配置的时候自动加载默认配置
  7. 2.配置文件变量名必须是大写
  8. """
  9. from django.conf import global_settings
  10. 查看源码
  11. global_settings.py
  12. LANGUAGE_CODE = 'en-us'
  13. ('zh-hans', gettext_noop('Simplified Chinese'))
  14. 疑问:为什么当用户配置了就使用用户配置的 不配置就使用默认的
  15. from django.conf import settings
  16. settings = LazySettings()
  17. manage.py文件
  18. os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'djangoProject.settings')
  19. ENVIRONMENT_VARIABLE = "DJANGO_SETTINGS_MODULE"
  20. class LazySettings(LazyObject):
  21. def _setup(self, name=None):
  22. # os.environ看成是一个全局大字典 'djangoProject.settings'
  23. settings_module = os.environ.get(ENVIRONMENT_VARIABLE)
  24. self._wrapped = Settings(settings_module) # Settings('djangoProject.settings')
  25. class Settings:
  26. def __init__(self, settings_module): # 'djangoProject.settings'
  27. # update this dict from global settings (but only for ALL_CAPS settings)
  28. for setting in dir(global_settings): # 获取全局配置文件里面所有的(大写)变量名
  29. if setting.isupper(): # 校验判断变量名是否是纯大写
  30. setattr(self, setting, getattr(global_settings, setting))
  31. # 给Settings对象添加全局配置文件中所有的配置信息
  32. # 例如 self.NAME = 'jason'
  33. # getattr(global_settings, setting) 获取全局设置文件中大写变量名对应的值
  34. # 大写变量名为健,对应的值为值
  35. # store the settings module in case someone later cares
  36. self.SETTINGS_MODULE = settings_module # 'djangoProject.settings'
  37. mod = importlib.import_module(self.SETTINGS_MODULE)
  38. # from djangoProject import settings # 导入暴露给用户的自定义配置文件
  39. # importlib.import_module 传入一个字符串(项目名字是动态变化的)可以导入相关模块
  40. for setting in dir(mod):
  41. if setting.isupper():
  42. setting_value = getattr(mod, setting)
  43. setattr(self, setting, setting_value)

单例模式 反射

功能的可插拔式配置

  1. # import os
  2. # print(os.environ) # 固定的全局大字典
  3. # d = {}
  4. # d['name'] = 'jason'
  5. # d.setdefault('xxx','lili')
  6. # print(d)
  7. # print(dir(d))
  8. import importlib # 传入一个字符串可以导入

模板语法之传值

  1. # 传值方式1:利用字典挨个传值
  2. return render(request,'index.html',{'i':i,'f':f,'s':s,'l':l,'d':d,'t':t,'se':se,'b':b})
  3. # 传值方式2:简单粗暴 locals()将当前名称空间中所有的变量名全部传递给页面
  4. return render(request,'index.html',locals())
  5. """
  6. 传值方式1 传值精确 不会造成资源浪费
  7. 传值方式2 传值粗糙 可能会造成一定的资源浪费
  8. ps:为了教学方便 我们以后就是用locals()
  9. """
  10. 补充:传递函数名和类名都会自动加括号调用(模板语法不支持额外的传参)

模板语法之获取值

  1. """模板语法取值只能采用 句点符(.)"""
  2. 索引 健都可以无限制的点点点
  3. <p>{{ d.hobby.3.username }}</p>

模板语法之过滤器

  1. # 类似于python的内置方法
  2. <p>过滤器:将竖杠左侧的数据当做第一个参数</p>
  3. <p>统计长度:{{ s|length }}</p>
  4. <p>加法运算:{{ i|add:100 }}</p>
  5. <p>字符串拼接:{{ s|add:'love' }}</p>
  6. <p>日期格式:{{ ctime|date:'Y年-m月-d日' }}</p>
  7. <p>默认值:{{ b|default:'中国' }}</p>
  8. <p>默认值:{{ b1|default:'中国' }}</p>
  9. <p>文件大小:{{ file_size|filesizeformat }}</p>
  10. <p>截取文本(引号也算 按字符截取):{{ s|truncatechars:3 }}</p>
  11. <p>截取文本(引号不算 按空格截取):{{ s|truncatewords:3 }}</p>
  12. <p>前端取消转义:{{ h|safe }}</p>
  13. <p>{{ sss }}</p>
  14. 转义
  15. 前端
  16. <p>前端取消转义:{{ h|safe }}</p>
  17. 后端
  18. # 后端取消转义
  19. from django.utils.safestring import mark_safe
  20. sss = mark_safe('<h2>学而不思则罔</h2>')
  21. ps:前端代码也可以在后端写好传入!!!

模板语法之标签

  1. # 类似于python的流程控制
  2. {% if b1 %}
  3. <p>有值</p>
  4. {% else %}
  5. <p>无值</p>
  6. {% endif %}
  7. {% for foo in l %}
  8. {# <p>内置对象:{{ forloop }}</p>#}
  9. <p>{{ foo }}</p>
  10. {% endfor %}
  11. {% for foo in s %}
  12. {% if forloop.first %}
  13. <p>这是我的第一次</p>
  14. {% elif forloop.last %}
  15. <p>这是我的最后一次</p>
  16. {% else %}
  17. <p>{{ foo }}</p>
  18. {% endif %}
  19. {% empty %}
  20. <p>传入的数据是空的 不存在</p>
  21. {% endfor %}
  22. """
  23. {{}} 变量相关
  24. {%%} 逻辑相关
  25. """
  26. # 了解
  27. {% with d.username as name %}
  28. {{ name }}
  29. {{ name }}
  30. {{ d.username }}
  31. {% endwith %}

自定义过滤器、标签、inclusion_tag

  1. # 类似于python里面的自定义函数
  2. 1.在应用下创建一个名字必须叫"templatetags"文件夹
  3. 2.在上述文件夹内创建一个任意名称的py文件
  4. 3.在该py文件内固定先书写以下两句话
  5. from django import template
  6. register = template.Library()
  7. app01\templatetags\mytag.py
  8. from django import template
  9. register = template.Library()
  10. # 自定义过滤器
  11. @register.filter(name='myfilter')
  12. def index(a,b):
  13. # 简单的加法运算
  14. return a + b
  15. index.html
  16. {% load mytag %}
  17. {{ i|myfilter:666 }}
  18. # 自定义标签
  19. app01\templatetags\mytag.py
  20. @register.simple_tag(name='mysimple')
  21. def func1(a,b,c,d):
  22. return '%s-%s|%s?%s'%(a,b,c,d)
  23. index.html
  24. {% load mytag %}
  25. {% mysimple 1 'jason' 222 'egon' %}
  26. inclusion_tag
  27. 当某个区域需要反复使用并且数据不是固定的
  28. # 自定义inclusion_tag
  29. app01\templatetags\mytag.py
  30. @register.inclusion_tag('login.html',name='my_inclusion_tag')
  31. def func2(n):
  32. l = []
  33. for i in range(1,n+1):
  34. l.append('第%s页'%i)
  35. return locals()
  36. index.html
  37. {% load mytag %}
  38. {% my_inclusion_tag 10 %}
  39. djangoProject\templates\login.html
  40. <ul>
  41. {% for foo in l %}
  42. <li>{{ foo }}</li>
  43. {% endfor %}
  44. </ul>

模板的导入

  1. # 类似于后端导入模块 想要什么局部页面直接导入即可
  2. {% include 'myform.html' %}

你学会了什么都不重要,你学不会什么都重要

模板的继承

  1. 先使用block划定区域
  2. 母版
  3. {% block 区域名称 %}
  4. {% endblock %}
  5. 子版
  6. {% extends 'home.html'%}
  7. {% block 区域名称 %}
  8. {% endblock %}
  9. 实例:
  10. {% extends 'home.html'%}
  11. {% block content %}
  12. <h1 class="text-center">注册</h1>
  13. <form action="">
  14. <p><input type="text" class="form-control"></p>
  15. <p><input type="text" class="form-control"></p>
  16. <input type="submit" class="btn btn-danger btn-block">
  17. </form>
  18. {% endblock %}
  19. 母版在划定区域的时候一般都应该由三个区域
  20. css区域
  21. html文档区域
  22. js区域
  23. ps:目的是为了让子版具有独立的css js 增加扩展性
  24. {% block css %}
  25. {% endblock %}
  26. {% block content %}
  27. {% endblock %}
  28. {% block js %}
  29. {% endblock %}
  30. ps:子版也可以继续使用母版划定区域内的内容
  31. {{ block.super }}

Django学习——Django settings 源码、模板语法之传值、模板语法之获取值、模板语法之过滤器、模板语法之标签、自定义过滤器、标签、inclusion_tag、模板的导入、模板的继承的更多相关文章

  1. Django的View(视图)-settings源码的解析-模板层-模板语法

    FBV与CBV 视图函数并不只是指函数,也可以是类 FBV:基于函数的视图,类似面向函数式编程 CBV:基于类的视图,类似面向对象编程 研究解析render源码: render:返回html页面:并且 ...

  2. django 之csrf、auth模块及settings源码、插拔式设计

    目录 基于django中间件拷贝思想 跨站请求伪造简介 跨站请求伪造解决思路 方式1:form表单发post请求解决方法 方式2:ajax发post请求解决方法 csrf相关的两个装饰器 csrf装饰 ...

  3. 跨站请求伪造(csrf),django的settings源码剖析,django的auth模块

    目录 一.跨站请求伪造(csrf) 1. 什么是csrf 2. 钓鱼网站原理 3. 如何解决csrf (1)思路: (2)实现方法 (3)实现的具体代码 3. csrf相关的装饰器 (1)csrf_p ...

  4. Django对中间件的调用思想、csrf中间件详细介绍、Django settings源码剖析、Django的Auth模块

    目录 使用Django对中间件的调用思想完成自己的功能 功能要求 importlib模块介绍 功能的实现 csrf中间件详细介绍 跨站请求伪造 Django csrf中间件 form表单 ajax c ...

  5. Django的settings源码分析

    Django其实有两个配置文件,一个是暴露给用户的可以自定义的配置,一个是项目默认的配置,用户如果配置了就用用户的,没有配置就用默认的. 首先需要在settings文件中导入,然后查看settings ...

  6. Django settings源码解析

    Django settings源码 Django中有两个配置文件 局部配置:配置文件settings.py,即项目同名文件夹下的settings.py文件 全局配置:django内部全局的配置文件se ...

  7. (day59)十一、CSRF、Auth模块、impotlib模块、settings源码

    目录 一.模拟实现中间件的编程思想 (一)impotlib模块 (二)实现功能的配置使用 二.跨站请求伪造CSRF (一)由来 (二)form表单的CSRF (三)ajax中的CSRF (1)通过da ...

  8. django----csrf跨站请求伪造 auth组件 settings源码 importlib模块

    目录 importlib模块 csrf跨站请求伪造 form表单发送 ajax发送 csrf装饰器 auth模块 如何创建超级用户(root) 创建用户 校验用户名和密码是否正确 保存用户登录状态 判 ...

  9. Hadoop学习笔记(9) ——源码初窥

    Hadoop学习笔记(9) ——源码初窥 之前我们把Hadoop算是入了门,下载的源码,写了HelloWorld,简要分析了其编程要点,然后也编了个较复杂的示例.接下来其实就有两条路可走了,一条是继续 ...

随机推荐

  1. spring学习三:Spring的Aop、代理

    ref:https://mp.weixin.qq.com/s/J77asUvw8FcnF-6YlX6AAw AOP相关术语:    Joinpoint(连接点):类里面可以被增强的方法,这些方法称为连 ...

  2. jvm-learning-双亲委派机制

    是什么 工作原理  例子 优势 什么是沙箱安全机制 其他知识 对类加载器的引用 类的主动使用和被动使用

  3. java-注解相关

    注解 概念:说明程序的,给计算机看  注释:用文字描述程序 先了解一些怎么正常javadoc文档 1:给类或者方法添加doc注释 2:通过命令javadoc 执行 类.java文件 新建的类: /** ...

  4. 图灵机器人 V1 和 V2 接入方法

    API1.0使用方法: import requests import json import yuyinhecheng as hc def Tuling(words):     Tuling_API_ ...

  5. JavaScript的取值小技巧之“中括号[]取值法”

    一.简介 做下记录,今天看了一篇很有意思的文章,学到了这个取值的小技巧 正常的话我们一般都是用对象直接去'.'对应的属性名(也就是键值对的键)来获取对应的值 这里记录的是另一种取值方式,他是采用中括号 ...

  6. Arduino 烧写bootloader

    什么是bootloader 一般情况下微处理器写入程序时都通过专门的编程器进行烧写,但是也可以通过在MCU中预先写入一些程序来实现某些基本功能,这些预先写入的程序代码就是bootloader.这样每次 ...

  7. 汽车中的V流程开发

    各步骤的简介各步骤的简介 (1)Control Design and offline Simulation:算法模型构建和离线仿真(基于模型的设计).算法工程师用Matlab模型实现算法:并实施离线仿 ...

  8. 3_一起燃烧卡路里/科学减肥(1)_系统分析实例_数学建模部分_Matlab/Simulink

     

  9. Web最佳实践阅读总结(1)

    介绍 最近开始刷一些书和题,此系列是介绍在读Web最佳实践的一些收获和体会. web前端发展现状 存在问题: 代码组织混乱 代码格式的问题突出 页面布局随意 网站整体性能差,没有意识到应用诸如缓存,动 ...

  10. 写了一个web os脚手架

    预览地址在这里:http://thx.github.io/magix-os/项目地址在这里:https://github.com/thx/magix-os 介绍下目录结构 核心目录cores主要是构成 ...