#####################################中间件################################################
settings.py
1 -- MIDDLEWARD=[
2 '......',
3 '..... ....',
4 '..... ..... .....',
5
6 ]
7 class Row1(MiddlewareMixin):
8 def process_request(self,request):
9 print('发送通过一')
10
11 def process_view(self, request, view_func, view_func_args, view_func_kwargs):
12 print('处理1')
13
14 def process_response(self, request, response):
15 print('返回2')
16 return response
17
18 from django.shortcuts import HttpResponse
19 class Row2(MiddlewareMixin):
20 def process_request(self,request):
21 print('发送通过二')
22 # return HttpResponse('走')
23
24 def process_view(self, request, view_func, view_func_args, view_func_kwargs):
25 print('处理2')
26
27 def process_response(self, request, response):
28 print('返回1')
29 return response
######################################缓存##############################################
Django中提供了6种缓存方式:
开发调试
内存
文件
数据库
Memcache缓存(python-memcached模块)
Memcache缓存(pylibmc模块)
a、开发调试
# 此为开始调试用,实际内部不做任何操作
# 配置:
1 CACHES = {
2 'default': {
3 'BACKEND': 'django.core.cache.backends.dummy.DummyCache', # 引擎
4 'TIMEOUT': 300, # 缓存超时时间(默认300,None表示永不过期,0表示立即过期)
5 'OPTIONS':{
6 'MAX_ENTRIES': 300, # 最大缓存个数(默认300)
7 'CULL_FREQUENCY': 3, # 缓存到达最大个数之后,剔除缓存个数的比例,即:1/CULL_FREQUENCY(默认3)
8 },
9 'KEY_PREFIX': '', # 缓存key的前缀(默认空)
10 'VERSION': 1, # 缓存key的版本(默认1)
11 'KEY_FUNCTION' 函数名 # 生成key的函数(默认函数会生成为:【前缀:版本:key】)
12 }
13 }
# 自定义key
1 def default_key_func(key, key_prefix, version):
2 """
3 Default function to generate keys.
4
5 Constructs the key used by all other methods. By default it prepends
6 the `key_prefix'. KEY_FUNCTION can be used to specify an alternate
7 function with custom key making behavior.
8 """
9 return '%s:%s:%s' % (key_prefix, version, key)
10
11 def get_key_func(key_func):
12 """
13 Function to decide which key function to use.
14
15 Defaults to ``default_key_func``.
16 """
17 if key_func is not None:
18 if callable(key_func):
19 return key_func
20 else:
21 return import_string(key_func)
22 return default_key_func
b、内存
# 此缓存将内容保存至内存的变量中
# 配置:
1 CACHES = {
2 'default': {
3 'BACKEND': 'django.core.cache.backends.locmem.LocMemCache',
4 'LOCATION': 'unique-snowflake',
5 }
6 }
7 # 注:其他配置同开发调试版本
c、文件
# 此缓存将内容保存至文件
# 配置:
1 CACHES = {
2 'default': {
3 'BACKEND': 'django.core.cache.backends.filebased.FileBasedCache',
4 'LOCATION': '/var/tmp/django_cache',
5 }
6 }
7 # 注:其他配置同开发调试版本
d、数据库
# 此缓存将内容保存至数据库
# 配置:
1 CACHES = {
2 'default': {
3 'BACKEND': 'django.core.cache.backends.db.DatabaseCache',
4 'LOCATION': 'my_cache_table', # 数据库表
5 }
6 }
7
8 # 注:执行创建表命令 python manage.py createcachetabl
e、Memcache缓存(python-memcached模块)
# 此缓存使用python-memcached模块连接memcache
1 CACHES = {
2 'default': {
3 'BACKEND': 'django.core.cache.backends.memcached.MemcachedCache',
4 'LOCATION': '127.0.0.1:11211',
5 }
6 }
7
8 CACHES = {
9 'default': {
10 'BACKEND': 'django.core.cache.backends.memcached.MemcachedCache',
11 'LOCATION': 'unix:/tmp/memcached.sock',
12 }
13 }
14
15 CACHES = {
16 'default': {
17 'BACKEND': 'django.core.cache.backends.memcached.MemcachedCache',
18 'LOCATION': [
19 '172.19.26.240:11211',
20 '172.19.26.242:11211',
21 ]
22 }
23 }
f、Memcache缓存(pylibmc模块)
# 此缓存使用pylibmc模块连接memcache
1 CACHES = {
2 'default': {
3 'BACKEND': 'django.core.cache.backends.memcached.PyLibMCCache',
4 'LOCATION': '127.0.0.1:11211',
5 }
6 }
7
8 CACHES = {
9 'default': {
10 'BACKEND': 'django.core.cache.backends.memcached.PyLibMCCache',
11 'LOCATION': '/tmp/memcached.sock',
12 }
13 }
14
15 CACHES = {
16 'default': {
17 'BACKEND': 'django.core.cache.backends.memcached.PyLibMCCache',
18 'LOCATION': [
19 '172.19.26.240:11211',
20 '172.19.26.242:11211',
21 ]
22 }
23 }
3种应用:
全局:全站使用
使用中间件,经过一系列的认证等操作,如果内容在缓存中存在,则使用FetchFromCacheMiddleware获取内容并返回给用户,
当返回给用户之前,判断缓存中是否已经存在,如果不存在则UpdateCacheMiddleware会将缓存保存至缓存,从而实现全站缓存
1 MIDDLEWARE = [
2 'django.middleware.cache.UpdateCacheMiddleware',#写入缓存
3 # 其他中间件...
4 'django.middleware.cache.FetchFromCacheMiddleware',#提示使用缓存
5 ]
6
7 CACHE_MIDDLEWARE_ALIAS = ""
8 CACHE_MIDDLEWARE_SECONDS = ""
9 CACHE_MIDDLEWARE_KEY_PREFIX = ""
视图函数:单独视图缓存
方式一:
1 from django.views.decorators.cache import cache_page
2
3 @cache_page(60 * 15)
4 def my_view(request):
5 ...
方式二:
1 from django.views.decorators.cache import cache_page
2
3 urlpatterns = [
4 url(r'^foo/([0-9]{1,2})/$', cache_page(60 * 15)(my_view)),
5 ]
模板:局部视图使用
a. 引入TemplateTag
{% load cache %}
b. 使用缓存
{% cache 5000 缓存key %}
缓存内容
{% endcache %}
############################################信号################################################
Django内置信号
1 Model signals
2 pre_init # django的modal执行其构造方法前,自动触发
3 post_init # django的modal执行其构造方法后,自动触发
4 pre_save # django的modal对象保存前,自动触发
5 post_save # django的modal对象保存后,自动触发
6 pre_delete # django的modal对象删除前,自动触发
7 post_delete # django的modal对象删除后,自动触发
8 m2m_changed # django的modal中使用m2m字段操作第三张表(add,remove,clear)前后,自动触发
9 class_prepared # 程序启动时,检测已注册的app中modal类,对于每一个类,自动触发
10 Management signals
11 pre_migrate # 执行migrate命令前,自动触发
12 post_migrate # 执行migrate命令后,自动触发
13 Request/response signals
14 request_started # 请求到来前,自动触发
15 request_finished # 请求结束后,自动触发
16 got_request_exception # 请求异常后,自动触发
17 Test signals
18 setting_changed # 使用test测试修改配置文件时,自动触发
19 template_rendered # 使用test测试渲染模板时,自动触发
20 Database Wrappers
21 connection_created # 创建数据库连接时,自动触发
对于Django内置的信号,仅需注册指定信号,当程序执行相应操作时,自动触发注册函数:
from django.core.signals import request_finished
from django.core.signals import request_started
from django.core.signals import got_request_exception
from django.db.models.signals import class_prepared
from django.db.models.signals import pre_init, post_init
from django.db.models.signals import pre_save, post_save
from django.db.models.signals import pre_delete, post_delete
from django.db.models.signals import m2m_changed
from django.db.models.signals import pre_migrate, post_migrate
from django.test.signals import setting_changed
from django.test.signals import template_rendered
from django.db.backends.signals import connection_created
#要注册的函数
def callback(sender, **kwargs):
print("xxoo_callback")
print(sender,kwargs)
xxoo.connect(callback)#注册到信号
# xxoo指上述导入的内容
from django.core.signals import request_finished
from django.dispatch import receiver
@receiver(request_finished)
def my_callback(sender, **kwargs):
print("Request finished!")
2、自定义信号
a. 定义信号
import django.dispatch
pizza_done = django.dispatch.Signal(providing_args=["toppings", "size"])
b. 注册信号
def callback(sender, **kwargs):
print("callback")
print(sender,kwargs)
pizza_done.connect(callback)
c. 触发信号
from 路径 import pizza_done
pizza_done.send(sender='seven',toppings=123, size=456)
##################################form表单###############################################
Form操作
完成:
- 验证用户请求
- 生成HTML
(保留上一次提交的数据)
Form类
创建Form类时,主要涉及到 【字段】 和 【插件】,字段用于对用户请求数据的验证,插件用于自动生成HTML
1、Django内置字段
1 Field
2 required=True, 是否允许为空
3 widget=None, HTML插件
4 label=None, 用于生成Label标签或显示内容
5 initial=None, 初始值
6 help_text='', 帮助信息(在标签旁边显示)
7 error_messages=None, 错误信息 {'required': '不能为空', 'invalid': '格式错误'}
8 show_hidden_initial=False, 是否在当前插件后面再加一个隐藏的且具有默认值的插件(可用于检验两次输入是否一直)
9 validators=[], 自定义验证规则
10 localize=False, 是否支持本地化
11 disabled=False, 是否可以编辑
12 label_suffix=None Label内容后缀
13
14 CharField(Field)
15 max_length=None, 最大长度
16 min_length=None, 最小长度
17 strip=True 是否移除用户输入空白
18
19 IntegerField(Field) 对数字进行验证
20 max_value=None, 最大值
21 min_value=None, 最小值
22
23 FloatField(IntegerField) 对浮点数字进行验证
24 ...
25
26 DecimalField(IntegerField)
27 max_value=None, 最大值
28 min_value=None, 最小值
29 max_digits=None, 总长度
30 decimal_places=None, 小数位长度
31
32 BaseTemporalField(Field)
33 input_formats=None 时间格式化
34
35 DateField(BaseTemporalField) 格式:2015-09-01
36 TimeField(BaseTemporalField) 格式:11:12
37 DateTimeField(BaseTemporalField)格式:2015-09-01 11:12
38
39 DurationField(Field) 时间间隔:%d %H:%M:%S.%f
40 ...
41
42 RegexField(CharField)
43 regex, 自定制正则表达式
44 max_length=None, 最大长度
45 min_length=None, 最小长度
46 error_message=None, 忽略,错误信息使用 error_messages={'invalid': '...'}
47
48 EmailField(CharField)
49 ...
50
51 FileField(Field)
52 allow_empty_file=False 是否允许空文件
53
54 ImageField(FileField) 图片
55 ...
56 注:需要PIL模块,pip3 install Pillow
57 以上两个字典使用时,需要注意两点:
58 - form表单中 enctype="multipart/form-data"
59 - view函数中 obj = MyForm(request.POST, request.FILES)
60
61 URLField(Field)
62 ...
63
64
65 BooleanField(Field)
66 ...
67
68 NullBooleanField(BooleanField)
69 ...
70
71 ChoiceField(Field) #下拉框 select option
72 ...
73 choices=(), 选项,如:choices = ((0,'上海'),(1,'北京'),)
74 required=True, 是否必填
75 widget=None, 插件,默认select插件
76 label=None, Label内容
77 initial=None, 初始值
78 help_text='', 帮助提示
79
80
81 ModelChoiceField(ChoiceField) #下拉框多选 select multiple='multiple option
82 ... django.forms.models.ModelChoiceField
83 queryset, # 查询数据库中的数据
84 empty_label="---------", # 默认空显示内容
85 to_field_name=None, # HTML中value的值对应的字段
86 limit_choices_to=None # ModelForm中对queryset二次筛选
87
88 ModelMultipleChoiceField(ModelChoiceField)
89 ... django.forms.models.ModelMultipleChoiceField
90
91
92
93 TypedChoiceField(ChoiceField)
94 coerce = lambda val: val 对选中的值进行一次转换
95 empty_value= '' 空值的默认值
96
97 MultipleChoiceField(ChoiceField)
98 ...
99
100 TypedMultipleChoiceField(MultipleChoiceField)
101 coerce = lambda val: val 对选中的每一个值进行一次转换
102 empty_value= '' 空值的默认值
103
104 ComboField(Field)
105 fields=() 使用多个验证,如下:即验证最大长度20,又验证邮箱格式
106 fields.ComboField(fields=[fields.CharField(max_length=20), fields.EmailField(),])
107
108 MultiValueField(Field)
109 PS: 抽象类,子类中可以实现聚合多个字典去匹配一个值,要配合MultiWidget使用
110
111 SplitDateTimeField(MultiValueField)
112 input_date_formats=None, 格式列表:['%Y--%m--%d', '%m%d/%Y', '%m/%d/%y']
113 input_time_formats=None 格式列表:['%H:%M:%S', '%H:%M:%S.%f', '%H:%M']
114
115 FilePathField(ChoiceField) 文件选项,目录下文件显示在页面中
116 path, 文件夹路径
117 match=None, 正则匹配
118 recursive=False, 递归下面的文件夹
119 allow_files=True, 允许文件
120 allow_folders=False, 允许文件夹
121 required=True, 是否必填
122 widget=None, 插件,默认select插件
123 label=None, 标签
124 initial=None, 默认值
125 help_text=''
126
127 GenericIPAddressField
128 protocol='both', both,ipv4,ipv6支持的IP格式
129 unpack_ipv4=False 解析ipv4地址,如果是::ffff:192.0.2.1时候,可解析为192.0.2.1, PS:protocol必须为both才能启用
130
131 SlugField(CharField) 数字,字母,下划线,减号(连字符)
132 ...
133
134 UUIDField(CharField) uuid类型
135 ...
View Code
2、Django内置插件:
1 TextInput(Input)
2 NumberInput(TextInput)
3 EmailInput(TextInput)
4 URLInput(TextInput)
5 PasswordInput(TextInput)
6 HiddenInput(TextInput)
7 Textarea(Widget)
8 DateInput(DateTimeBaseInput)
9 DateTimeInput(DateTimeBaseInput)
10 TimeInput(DateTimeBaseInput)
11 CheckboxInput
12 Select
13 NullBooleanSelect
14 SelectMultiple
15 RadioSelect
16 CheckboxSelectMultiple
17 FileInput
18 ClearableFileInput
19 MultipleHiddenInput
20 SplitDateTimeWidget
21 SplitHiddenDateTimeWidget
22 SelectDateWidget
View Code
常用选择插件
1 # 单radio,值为字符串
2 # user = fields.CharField(
3 # initial=2,
4 # widget=widgets.RadioSelect(choices=((1,'上海'),(2,'北京'),))
5 # )
6
7 # 单radio,值为字符串
8 # user = fields.ChoiceField(
9 # choices=((1, '上海'), (2, '北京'),),
10 # initial=2,
11 # widget=widgets.RadioSelect
12 # )
13
14 # 单select,值为字符串
15 # user = fields.CharField(
16 # initial=2,
17 # widget=widgets.Select(choices=((1,'上海'),(2,'北京'),))
18 # )
19
20 # 单select,值为字符串
21 # user = fields.ChoiceField(
22 # choices=((1, '上海'), (2, '北京'),),
23 # initial=2,
24 # widget=widgets.Select
25 # )
26
27 # 多选select,值为列表
28 # user = fields.MultipleChoiceField(
29 # choices=((1,'上海'),(2,'北京'),),
30 # initial=[1,],
31 # widget=widgets.SelectMultiple
32 # )
33
34
35 # 单checkbox
36 # user = fields.CharField(
37 # widget=widgets.CheckboxInput()
38 # )
39
40
41 # 多选checkbox,值为列表
42 # user = fields.MultipleChoiceField(
43 # initial=[2, ],
44 # choices=((1, '上海'), (2, '北京'),),
45 # widget=widgets.CheckboxSelectMultiple
46 # )
View Code