1. 程式人生 > >python第一百一十天--Django 5

python第一百一十天--Django 5

trie frequency ble ase setting pan ons class box

#####################################中間件################################################

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

python第一百一十天--Django 5