django中 debug-toolbar插件 crm項目補充

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.登陸
  
登陸成功後權限信息的初識化
  根據用戶獲取當前用戶的權限信息
  跨表 去空 去重
  構建數據結構
  權限的結構    簡單的權限控制    非菜單權限的歸屬    路徑導航    權限控制到按鈕級別  菜單的結構    一級菜單    二級菜單     非權限菜單的歸屬    權限和菜單的數據結構
相關文章
相關標籤/搜索