• 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
  • 相关阅读:
    Mongodb C#客户端数据关联数据,使用Linq语法进行关联
    express增加swagger功能
    RabbitMQ错误检查
    nodejs mongoose populate 多层模型
    c# Mongodb
    vscode安装过的插件
    phantomjs安装步骤
    记录平时有用到的前端学习网站
    初学做uniapp项目过程梳理的一些记录
    用纯css实现双边框效果
  • 原文地址:https://www.cnblogs.com/uge3/p/7413108.html
Copyright © 2020-2023  润新知