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         ...
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
原文地址:https://www.cnblogs.com/uge3/p/7413108.html