django中使用debug-toolbar插件python
環境安裝:jquery
pip install debug-toolbar
在django中的settings中配置如下數據redis
註冊debug-toolbarsql
中間件中加入數據庫
若是是本機測試,須要將127.0.0.1加入到 INTERNAL_IPSdjango
配置jqery中的urljson
若是在國內沒法使用,能夠在settings中配置如下,緩存
若是在Django項目中使用了jquery的話就能夠直接將這一項置爲空,那麼django-debug-toolbar 就會使用你項目中用到的jquery:session
配置完成以後,啓動django項目能夠看到如下內容就是debug-toolbar啓動成功數據結構
緩存
- 開發調試
- 內存
- 文件
- 數據庫
- Memcache緩存(python-memcached模塊)
- Memcache緩存(pylibmc模塊)
django-redis
中文文檔:https://django-redis-chs.readthedocs.io/zh_CN/latest/
做爲 cache backend
在django的settings中配置如下數據
CACHES = { "default": { "BACKEND": "django_redis.cache.RedisCache", "LOCATION": "redis://127.0.0.1:6379/1", "OPTIONS": { "CLIENT_CLASS": "django_redis.client.DefaultClient", } } }
將 django-redis 做爲 session 儲存
settings中配置
SESSION_ENGINE = "django.contrib.sessions.backends.cache" SESSION_CACHE_ALIAS = "default"
信號
Django中提供了「信號調度」,用於在框架執行操做時解耦。通俗來說,就是一些動做發生的時候,信號容許特定的發送者去提醒一些接受者。
Django內置信號:
Model signals pre_init # django的model執行其構造方法前,自動觸發 post_init # django的model執行其構造方法後,自動觸發 pre_save # django的model對象保存前,自動觸發 post_save # django的model對象保存後,自動觸發 pre_delete # django的model對象刪除前,自動觸發 post_delete # django的model對象刪除後,自動觸發 m2m_changed # django的model中使用m2m字段操做第三張表(add,remove,clear)先後,自動觸發 class_prepared # 程序啓動時,檢測已註冊的app中modal類,對於每個類,自動觸發 Management signals pre_migrate # 執行migrate命令前,自動觸發 post_migrate # 執行migrate命令後,自動觸發 Request/response signals request_started # 請求到來前,自動觸發 request_finished # 請求結束後,自動觸發 got_request_exception # 請求異常後,自動觸發 Test signals setting_changed # 使用test測試修改配置文件時,自動觸發 template_rendered # 使用test測試渲染模板時,自動觸發 Database Wrappers connection_created # 建立數據庫鏈接時,自動觸發
對於Django內置的信號,僅需註冊指定信號,當程序執行相應操做時,自動觸發註冊函數:
註冊信號,寫入與project同名的文件夾下的_init_.py文件中,也是換數據庫引擎的地方。
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指上述導入的內容
實例用法:
def my_callback(sender,**kwargs): print('我是嘻嘻嘻的兄弟.') #方法一: from django.core.signals import request_finished request_finished.connect(my_callback) # 方法二: from django.core.signals import request_finished from django.dispatch import receiver @receiver(request_finished) def my_callback(sender, **kwargs): print("Request finished!")
新增數據的數據的時候寫一條日誌
如何提高orm性能
1.能用values()就用values() 2.select_related 連表查詢 #適用於一對一,一對多,就是普通的連表查詢 3.prefetch_related 子查詢 #適用於多對多,能夠理解成先對一張表的數據進行查找,而後在將這個查詢結果做爲下一次的查詢條件 4.only(‘字段’) defer('字段') only是隻顯示寫的字段 , defer是排除寫的字段
如何使用多個數據庫
DATABASES = { 'default': { 'ENGINE': 'django.db.backends.sqlite3', 'NAME': os.path.join(BASE_DIR, 'db.sqlite3'), }, 'db2': { 'ENGINE': 'django.db.backends.sqlite3', 'NAME': os.path.join(BASE_DIR, 'db2.sqlite3'), }, }
對指定的數據庫遷移 :
python manage.py migrate --database db2
如何實現讀寫分離:
手動:
obj=models.Student.objects.using('db2').get('pk=1') #讀
models.Student.objects.using('default').create(pk=2,name='喜羊羊')
obj.save(using='db2')
自動:
在myrouter.py文件中寫如下的類:
class Router:
def db_for_read(self,model,**kwargs):
return 'default'
def db_for_write(self,model,**kwargs):
return 'db2'
settings配置中 DATABASE_ROUTERS= ['myrouter.Router']
一主多從
概念:一主多從的意思是一個讀,多個寫或者多個讀,一個寫
隨機的從下面的讀 class Router: def db_for_read(self,model,**kwargs): return random.choice([db1,db2,db3]) def db_for_write(self,model,**kwargs): return 'default'
分庫分表
class Router: # app01 default # app02 db2 def db_for_read(self, model, **kwargs): if model._meta.app_label == 'app01': return 'default' elif model._meta.app_label == 'app02': return 'db2' def db_for_write(self, model, **kwargs): if model._meta.app_label == 'app01': return 'default' elif model._meta.app_label == 'app02': return 'db2'
crm相關內容:
crm是什麼?
客戶管理系統,銷售人員增多,客戶增多,提升工做效率
爲何要設立公戶私戶?
避免銷售進行搶單
設置限制,提升銷售的工做效率,好比3天一跟進,20天成單
私戶的上限,通常是150,根據具體公司分析
有現成的crm系統嗎?爲何不用現成的?
學邦
定製化程度高,若是要加需求要收費
權限變化以後,從新登陸才能應用權限? 不從新登陸就能應用新的權限?
權限變化以後去修改session中用戶的權限
改表結構 用戶表 + 字段 session_key
開發中遇到了什麼問題(影響深入)?
json序列化
表結構的變化
需求的取捨
rbac
rbac如何實現權限的控制?
url就表明權限,能訪問這個url就表示有這個權限。
流程:
1.中間件
白名單
登陸校驗
免認證
權限的校驗
pid,id 有pid表示當前訪問的是子權限
沒有pid 當前訪問的是父權限 二級菜單
2.登陸
登陸成功後權限信息的初識化
根據用戶獲取當前用戶的權限信息
跨表 去空 去重
構建數據結構
權限的結構 簡單的權限控制 非菜單權限的歸屬 路徑導航 權限控制到按鈕級別 菜單的結構 一級菜單 二級菜單 非權限菜單的歸屬 權限和菜單的數據結構