当前位置: 首页 > news >正文

[Django 0-1] Core.Checks 模块

Checks 源码分析

Django 的 checks 模块提供了一系列的检查函数,用于检查 Django 项目的配置是否正确。

文件结构

.
├── __init__.py
├── async_checks.py
├── caches.py
├── compatibility
│   ├── __init__.py
│   └── django_4_0.py
├── database.py
├── files.py
├── messages.py
├── model_checks.py
├── registry.py
├── security
│   ├── __init__.py
│   ├── base.py
│   ├── csrf.py
│   └── sessions.py
├── templates.py
├── translation.py
└── urls.py3 directories, 17 files

可以学习的地方

  • 对项目的可靠性检查方面可以借鉴 Django 的设计,可以包括

    • 内置的 contrib 如 admin
    • async_support 特性检查,如是否在不支持的环境下开启了异步支持
    • 缓存配置检查,如是否使用了过期时间短的缓存
    • 数据库配置检查,如是否使用了过期时间短的数据库连接
    • 模型检查,如是否有重复的模型名称
    • 安全检查,如是否开启了 CSRF 保护,是否使用了过期时间短的 session
    • 模板检查
    • 翻译检查
    • URL 检查
    • siangls 检查
    • files 文件系统检查
  • 使用inspect.func_accepts_kwargs函数,强制让函数参数中包含**kwargs
    同样的函数还有func_accepts_var_args,强制让函数参数中包含*args
    func_supports_parameter置顶

  • core/checks/registry.py CheckRegistry 类方法提供了利用装饰器机制封装了函数register用于注册检查。


class CheckRegistry:def __init__(self):self.registered_checks = set()self.deployment_checks = set()def register(self, check=None, *tags, **kwargs):"""Can be used as a function or a decorator. Register given function`f` labeled with given `tags`. The function should receive **kwargsand return list of Errors and Warnings.Example::registry = CheckRegistry()@registry.register('mytag', 'anothertag')def my_check(app_configs, **kwargs):# ... perform checks and collect `errors` ...return errors# orregistry.register(my_check, 'mytag', 'anothertag')"""def inner(check):if not func_accepts_kwargs(check):raise TypeError("Check functions must accept keyword arguments (**kwargs).")check.tags = tagschecks = (self.deployment_checksif kwargs.get("deploy")else self.registered_checks)checks.add(check)return check# 如果你的check函数是一个callable对象,那么直接返回inner(check)if callable(check):return inner(check)else:if check:tags += (check,)return inner
  • 为项目建立一个 runtime 检查机制,通过这些 checks 来确保项目的运行正确。

id 可以确保所有 errors 和 warnings 的唯一性,并提供一种过滤 id 和 level 机制来忽略特定的错误。

class CheckMessage:def __init__(self, level, msg, hint=None, obj=None, id=None):if not isinstance(level, int):raise TypeError("The first argument should be level.")self.level = levelself.msg = msgself.hint = hintself.obj = objself.id = iddef __eq__(self, other):return isinstance(other, self.__class__) and all(getattr(self, attr) == getattr(other, attr)for attr in ["level", "msg", "hint", "obj", "id"])def __str__(self):from django.db import modelsif self.obj is None:obj = "?"elif isinstance(self.obj, models.base.ModelBase):# We need to hardcode ModelBase and Field cases because its __str__# method doesn't return "applabel.modellabel" and cannot be changed.obj = self.obj._meta.labelelse:obj = str(self.obj)id = "(%s) " % self.id if self.id else ""hint = "\n\tHINT: %s" % self.hint if self.hint else ""return "%s: %s%s%s" % (obj, id, self.msg, hint)def __repr__(self):return "<%s: level=%r, msg=%r, hint=%r, obj=%r, id=%r>" % (self.__class__.__name__,self.level,self.msg,self.hint,self.obj,self.id,)def is_serious(self, level=ERROR):return self.level >= leveldef is_silenced(self):from django.conf import settingsreturn self.id in settings.SILENCED_SYSTEM_CHECKSclass Debug(CheckMessage):def __init__(self, *args, **kwargs):super().__init__(DEBUG, *args, **kwargs)class Info(CheckMessage):def __init__(self, *args, **kwargs):super().__init__(INFO, *args, **kwargs)class Warning(CheckMessage):def __init__(self, *args, **kwargs):super().__init__(WARNING, *args, **kwargs)class Error(CheckMessage):def __init__(self, *args, **kwargs):super().__init__(ERROR, *args, **kwargs)class Critical(CheckMessage):def __init__(self, *args, **kwargs):super().__init__(CRITICAL, *args, **kwargs)

相关文章:

  • 传统电力运维企业的数字化转型案例
  • 数据结构的概念大合集03(栈)
  • 使用Docker搭建Jellyfin
  • 阿里提前批(阿里云)一面30min
  • 【机器学习】分类模型的评价方法
  • 更安全的C gets()和str* 以及fgets和strcspn的用法
  • 【基础CSS】
  • 3.Windows下安装MongoDB和Compass教程
  • JavaScprit之初识面向对象
  • 用所有语言写“Hello, World!“
  • WebRTC:真正了解 RTP 和 RTCP
  • C++从零开始(day52)——unordered_set,unordered_map学习使用
  • Visual Studio项目模板的创建与使用
  • 基于 K8s 容器集群的容灾架构与方案
  • (每日持续更新)jdk api之StringBufferInputStream基础、应用、实战
  • 《用数据讲故事》作者Cole N. Knaflic:消除一切无效的图表
  • angular2开源库收集
  • canvas实际项目操作,包含:线条,圆形,扇形,图片绘制,图片圆角遮罩,矩形,弧形文字...
  • co.js - 让异步代码同步化
  • ES6核心特性
  • Git 使用集
  • HTML5新特性总结
  • Java基本数据类型之Number
  • leetcode46 Permutation 排列组合
  • October CMS - 快速入门 9 Images And Galleries
  • oldjun 检测网站的经验
  • React-flux杂记
  • Vue2.0 实现互斥
  • Vue官网教程学习过程中值得记录的一些事情
  • 阿里云前端周刊 - 第 26 期
  • 工程优化暨babel升级小记
  • 回顾2016
  • 记录:CentOS7.2配置LNMP环境记录
  • 一加3T解锁OEM、刷入TWRP、第三方ROM以及ROOT
  • 用Canvas画一棵二叉树
  • Nginx惊现漏洞 百万网站面临“拖库”风险
  • Nginx实现动静分离
  • (WSI分类)WSI分类文献小综述 2024
  • (附源码)计算机毕业设计ssm本地美食推荐平台
  • (附源码)小程序儿童艺术培训机构教育管理小程序 毕业设计 201740
  • (没学懂,待填坑)【动态规划】数位动态规划
  • (推荐)叮当——中文语音对话机器人
  • (轉貼) 2008 Altera 亞洲創新大賽 台灣學生成果傲視全球 [照片花絮] (SOC) (News)
  • .\OBJ\test1.axf: Error: L6230W: Ignoring --entry command. Cannot find argumen 'Reset_Handler'
  • .a文件和.so文件
  • .NetCore实践篇:分布式监控Zipkin持久化之殇
  • [ 隧道技术 ] cpolar 工具详解之将内网端口映射到公网
  • [BZOJ2208][Jsoi2010]连通数
  • [C#]C# winform部署yolov8目标检测的openvino模型
  • [C++] 多线程编程-thread::yield()-sleep_for()
  • [CUDA 学习笔记] CUDA kernel 的 grid_size 和 block_size 选择
  • [ES-5.6.12] x-pack ssl
  • [Firefly-Linux] RK3568修改控制台DEBUG为普通串口UART
  • [HTML]Web前端开发技术18(HTML5、CSS3、JavaScript )HTML5 基础与CSS3 应用——喵喵画网页
  • [JS] 常用正则表达式集(一)