python第一百一十天--Django 5
阿新 • • 發佈:2017-08-22
trie frequency ble ase setting pan ons class box
#####################################中間件################################################
settings.py
1 -- MIDDLEWARD=[ 2 ‘......‘, 3 ‘..... ....‘, 4 ‘..... ..... .....‘, 5 6 ] 7 class Row1(MiddlewareMixin): 8 defprocess_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 response17 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): 25print(‘處理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 SelectDateWidgetView 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