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         # )

时间: 2024-10-11 04:12:34

python第一百一十天--Django 5的相关文章

python第一百一十一天 --Django 6

创建数据库,设计表结构和字段 使用 MySQLdb 来连接数据库,并编写数据访问层代码 业务逻辑层去调用数据访问层执行数据库操作 1 import MySQLdb 2 3 def GetList(sql): 4 db = MySQLdb.connect(user='root', db='wupeiqidb', passwd='1234', host='localhost') 5 cursor = db.cursor() 6 cursor.execute(sql) 7 data = cursor.

python学习笔记十五 django基础

Python的WEB框架有Django.Tornado.Flask 等多种,Django相较与其他WEB框架其优势为:大而全,框架本身集成了ORM.模型绑定.模板引擎.缓存.Session等诸多功能. 1.创建django程序 通过命令行 django-admin startproject mysite 创建project 一个工程可以包含多个app,app共用一个project的配置文件 cd mysite python manage.py startapp app01 创建app01 pyt

python学习笔记十六 django深入学习一

django 请求流程图 django 路由系统 在django中我们可以通过定义urls,让不同的url路由到不同的处理函数 from . import views urlpatterns = [ url(r'^articles/2003/$', views.special_case_2003), #精确匹配 url(r'^articles/([0-9]{4})/$', views.year_archive), #动态路由 url(r'^articles/([0-9]{4})/([0-9]{2

Python 学习第十九天 django知识

一,django 知识总结 1,同一个name属性的标签,多个值获取 <form action="/login/" method="POST" enctype="multipart/form-data"> <p> <input type="text" name="user" placeholder="用户名" /> </p> <p&g

python第一百零九天---Django 4

session :1. Session 基于Cookie做用户验证时:敏感信息不适合放在cookie中 a. Session原理 Cookie是保存在用户浏览器端的键值对 Session是保存在服务器端的键值对: 保存在数据库 使用session 前需要 执行 --Python manage.py makemigrations --python manage.py migrate 保存在内存中的形式: '随机字符串':{ 'username': '....', 'loging': '....',

python第一百一十八天---ajax--图片验证码 + Session

原生AJAX Ajax主要就是使用 [XmlHttpRequest]对象来完成请求的操作,该对象在主流浏览器中均存在(除早起的IE),Ajax首次出现IE5.5中存在(ActiveX控件). 1.XmlHttpRequest对象介绍 XmlHttpRequest对象的主要方法: 1 XmlHttpRequest对象的主要方法: 2 a. void open(String method,String url,Boolen async) 3 用于创建请求 4 5 参数: 6 method: 请求方式

python 学习笔记十九 django项目bbs论坛

跨站请求伪造保护 CSRF 中间件和模板标签提供对跨站请求伪造简单易用的防护.某些恶意网站上包含链接.表单按钮或者JavaScript ,它们会利用登录过的用户在浏览器中的认证信息试图在你的网站上完成某些操作,这就是跨站攻击.还有另外一种相关的攻击叫做“登录CSRF”,攻击站点触发用户浏览器用其它人的认证信息登录到其它站点. 全局: 中间件 django.middleware.csrf.CsrfViewMiddleware 局部: @csrf_protect,为当前函数强制设置防跨站请求伪造功能

一起talk C栗子吧(第一百一十六回:C语言实例--线程同步之互斥量二)

各位看官们,大家好,上一回中咱们说的是线程同步之信号量的例子,这一回咱们继续说该例子.闲话休提,言归正转.让我们一起talk C栗子吧! 我们在上一回中详细介绍了互斥量相关函数的用法,这一回中,我们介绍如何使用这些函数来操作互斥量. 下面是详细的操作步骤: 1.定义一个互斥量A,用来同步线程: 2.在创建线程的进程中使用pthread_mutex_init函数初始化互斥量,互斥量的属性使用默认值: 3.在读取数据的线程中读取数据,首先使用pthread_mutex_lock函数对互斥量A进行加锁

python第一百一十七天-----ModelForm组件

Model + Form => 验证 + 数据库操作 - class LoginModelForm(xxxxx): 利用model.A中的字段 1. 生成HTML标签:class Meta: ... 2. mf = xxxModelForm(instance=ModelObj) 3. 额外的标签, is_rmb = Ffields.CharField(widget=Fwidgets.CheckboxInput()) 4. 各种验证 is_valid() -> 各种钩子... 5. mf.sav