python第一百一十天--Django 5
#####################################中间件################################################
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 ...
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
常用选择插件
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 # )
您的资助是我最大的动力!
金额随意,欢迎来赏!
如果,您希望更容易地发现我的新博客,不妨点击一下绿色通道的
因为,我的写作热情也离不开您的肯定支持,感谢您的阅读,我是【莫柔落切】!
联系或打赏博主【莫柔落切】!https://home.cnblogs.com/u/uge3/