目录

  • 简述
  • core.cache
  • __init__.py
  • utils.py
  • backends
  • 小结
  • core.checks
  • core.files
  • core.handlers
  • core.mail
  • core.serializers
  • core.servers
  • core.paginator
  • core.signals
  • core.signing
  • core.validators
  • 小结

简述

上一篇中,我从Django如何建立项目开始,引出了django.core.management模块。这一篇,我将顺序阅读django.core下的其他模块。

core.cache

我们先来看一下源码中,此模块下的目录树。

python Django源码 django源码分析_django

__init__.py

这个初始化文件,定义了我们在项目中经常使用的cache类对象。
from django.core.cache import cache 初始化文件中为cache做了一层代理。这样处理使得Django可以同时使用多个cache,通过asia来区分不同的cache。
多个caches的配置示例:

CACHES = {
	‘mysql‘: {
		‘BACKEND‘: ‘django.core.cache.backends.db.DatabaseCache‘,
		‘LOCATION‘: ‘cache‘,
	},
	‘dummy‘: {
		‘BACKEND‘: ‘django.core.cache.backends.dummy.DummyCache‘
	},
	‘redis‘: {
		‘BACKEND‘: ‘redis_cache.RedisCache‘,
		‘LOCATION‘: ‘127.0.0.1:6379‘,
	},
}
CACHES[‘default‘]=CACHES[‘redis‘]			#必须有一个default配置

基类的初始化方法中为所有不能为空的参数设置了默认值。
timeout:key过期时间,
可选参数下:
max_entries:最大存储量
cull_frequency:当存储的数据超过最大限制时,会根据这个参数进行数据清除。默认为3,即清除1/3的数据。
key_prefix,version,key_func这三个是默认构造key名时需要的参数,大多数情况下我们会在项目中自己设置构造方法。

utils.py

backends

这里是Django内置的6种缓存方式。包括数据库缓存,开发调试缓存,文件系统缓存,本地内存缓存,memcache缓存(又分为两种链接形式)。
base.py
cache对象的基类。从基类方法中,我们可以看到Django为cache提供的所有数据处理方法。

python Django源码 django源码分析_python Django源码_02

在没有看源码之前,我对cache方法知道的就是基本的cache.get(),cache.set(),cache.delete(),cache.has_hey()。
在阅读了源码之后,发现cache还提供了批量处理的方法,cache.get_many(),cache.delete_many()。源码中标注,这两个方法在使用memcahche缓存的场景下对数据处理都有有效的提升。
cache.touch,使用配置的timeout,刷新key的生存时间。

db.py
基于数据库的缓存。
需要配置table名。可以使用Django提供的 python manage.py createcachetable 命令自动生成数据表。
需要注意的是:
此方式使用pickle序列化对象.所以存储任何对象都是可以的,最后都会被转化为数据库支持的字符串。
dummy.py
测试使用的缓存.这个缓存功能相当有限,仅仅只能被用于测试.而且本身无任何逻辑,只是返回一些默认值.
filebased.py
基于文件的缓存。这个文件系统缓存,实现了基于每个缓存对象一个文件的对应.只是在处理多文件管理时,使用了一些必要的方法.
locmem.py
基于内存的缓存。实现了带锁的内存缓存系统,线程安全。
memcached.py
基于memcached的缓存系统。
Django支持的最快,最高效的缓存类型, Memcached是一个全部基于内存的缓存服务,是个守护进程,它被分配了单独的内存块。 它做的所有工作就是为缓存提供一个快速的添加,检索,删除的接口。 所有的数据直接存储在内存中,所以它不能取代数据库或者文件系统的使用。
在安装Memcached后,还需要安装Memcached依赖模块。Python有不少Memcache模块最为常用的是python-memcached and pylibmc两个模块。Django内置的缓存也是基于这两个模块。
MemcachedCache
基于python-memcached
PyLibMCCache
基于pylibmc

小结

流行的cache存储后端还有redis,django-redis是第三方的存储后端模块,当然也是基于djangocache中BaseCache基类开发的。浏览源码会发现和内置的存储方法逻辑一致。
cache在Django中的应用主要有三种:在视图View中使用、在路由URLConf中使用、在模板中使用。具体的内容会在解析到响应功能模块时说明。

core.checks

Django的系统检查框架模块。用来在Django项目启动的时候判断是否有异常的。它一般用于识别出问题并且提示如何解决这个问题。
检测函数会在使用check命令时触发,在使用runserver和migrate的时候也会被触发。不过出于性能上的考虑,checks不会在WSGI中被触发,所以这种时候需要自己执行check。
检查的结果会在控制台上展现,假如你觉得不需要,可以在配置文件中使用SILENCED_SYSTEM_CHECKS,这个参数要求是个列表,列表中显示不需要显示的信息id。

core.files

Django默认的文件存储系统模块。
提供 图片文件、文件锁、移动文件、存储文件、创建临时文件、上传文件的基本操作方法。

core.handlers

说实话,再看这个模块的时候,我着实花费了很长时间去学习我之前并不了解的底层原理,包括WSGI协议、webserver流程、网络tcp\udp原理、socket等内容。当我对这些内容有了基本了解之后,再来看这个模块,发现简单易懂。

这个模块简单来说就是django提供的一个沟通web服务器和web应用框架框架的模块。模块接收符合WSGI协议的request信息,传入web应用程框架,处理之后返回符合WSGI协议的response信息。

web服务器与django之间的通讯方式和流程如下:

python Django源码 django源码分析_django_03

core.mail

django封装好的邮件模块。
在settings中配置邮件信息

ADMINS = (
    ('name', 'username@**.**'),
)
MANAGERS = (
    ('name', 'username@**.**'),
)
EMAIL_BACKEND = 'django.core.mail.backends.smtp.EmailBackend'
EMAIL_SUBJECT_PREFIX = ''
EMAIL_HOST = ''
EMAIL_PORT = 465
EMAIL_USE_SSL = True\false
DEFAULT_FROM_EMAIL = ''
SERVER_EMAIL = ''
EMAIL_HOST_USER = ''
EMAIL_HOST_PASSWORD = ''

提供的方法有:

python Django源码 django源码分析_django_04

core.serializers

django提供的对 对象 的序列化和反序列化模块。
使用方法:

from django.core import serializers
json = serializers.serialize("json", some_queryset)
objects = list(serializers.deserialize("json", json))

注意:只提供针对 模型对象 的序列化和反序列化方法,至于自己编写的对象,需要我们重写序列化和反序列化方法。
默认提供四种序列化格式:json,xml,python,yaml。
可以自定义序列化格式,在settings中配置

SERIALIZATION_MODULES = {
        "csv": "path.to.csv.serializer",
        "txt": "path.to.txt.serializer",
    }

core.servers

为django内置的wsgiserver。在使用runserver启动服务时,就是调用的这个服务器。这个服务是单线程的,仅供开发和测试使用。
core.servers中仅有一个文件basehttp,查看文件的说明,可以看出servers.basehttp是Django自身提供的一个用于开发测试的server模块,其中提供的WSGIServer、ServerHandler、WSGIRequestHandler其实都是属于WSGI server,django只不过是对python内置的wsgiref模块simple_server做的一层包装。

core.paginator

django内置的分页模块。
对object_list快速实现分页功能。
下面这个文章介绍的很详细。

core.signals

django内置的几个初始化信号。

core.signing

Django内置的签名加密模块。
Django在生成项目的时候,会在settings中生成一个唯一的SECRET_KEY。这个SECRET_KEY被用来和要加密的参数组合

常用方法一:
>>> from django.core.signing import Signer
>>> signer = Signer()
>>> value = signer.sign('My string')
>>> value
'My string:GdMGD6HNQ_qdgxYP8yBZAdAIV1w'

>>> original = signer.unsign(value)
>>> original
'My string'
常用方法二:
>>> from datetime import timedelta
>>> from django.core.signing import TimestampSigner
>>> import time
>>> signer = TimestampSigner()
>>> value = signer.sign('hello')
>>> value
'hello:1NMg5H:oPVuCqlJWmChm1rA2lyTUtelC-c'
>>> signer.unsign(value)
'hello'
>>> time.sleep(15)
>>> signer.unsign(value, max_age=10)
...
SignatureExpired: Signature age 15.5289158821 > 10 seconds
>>> signer.unsign(value, max_age=20)
'hello'
>>> signer.unsign(value, max_age=timedelta(seconds=20))
'hello'

core.validators

Django内置的校验模块。用来对值进行正则校验,多配合form表单使用。

小结