Python學習----第七模塊筆記(Web開發進階之Django基礎)

一、Django簡介

1.一、Web框架

Web框架(web framework)或者叫作Web應用框架(web application framework),是用於進行web開發的一套軟件結構。大多數的web框架提供了一套開發和部署網站的方式,爲web行爲提供了一套支持方法。使用web框架,不少業務邏輯外的功能不須要本身再去完善,而是使用框架已有的功能就能夠了。html

Web框架可分爲MVC(Model模型、Views視圖、Controller控制器)和MTV(Model模型、Templates模板、Views視圖)。前端

1.二、Django簡介

Django是一個流行的開源的基於Python的重量級Web框架,集成了ORM、模型綁定、模板引擎、緩存、Session等諸多功能。Django使用了MTV模式。python

Django的設計十分優美:web

  • 對象關係映射(ORM),以Python類形式定義你的數據模型,ORM將模型與關係數據庫鏈接起來,你將獲得一個很是容易使用的數據庫API,同時你也能夠在Django中使用原始的SQL語句。
  • URL分派,使用正則表達式匹配URL,你能夠設計任意的URL,沒有框架的特定限定。像你喜歡的同樣靈活。
  • 模板系統,使用Django強大而可擴展的模板語言,能夠分隔設計、內容和Python代碼。而且具備可繼承性。
  • 表單處理,你能夠方便的生成各類表單模型,實現表單的有效性檢驗。能夠方便的從你定義的模型實例生成相應的表單。
  • 緩存系統,能夠掛在內存緩衝或其它的框架實現超級緩衝 -- 實現你所須要的粒度。
  • 會話(Session),用戶登陸與權限檢查,快速開發用戶會話功能。
  • 自動化的管理界面,不須要你花大量的工做來建立人員管理和更新內容。Django自帶一個ADMIN site,相似於內容管理系統。

二、Django安裝及配置

2.一、Django的安裝

Django官網https://www.djangoproject.com/ajax

使用pip install django便可安裝Django。當前使用pip安裝的Django版本爲2.0.3。正則表達式

2.二、Django工程建立及目錄詳解

安裝Django後,便可使用如下命令建立Django工程:redis

django-admin startproject 工程名稱

Django工程建立完成後,在指定目錄將出現如下結構的目錄:數據庫

工程名稱/
    |
    | -- 工程名稱/
    |    | -- init.py
    |    | -- settings.py    # Django的配置文件
    |    | -- urls.py    # Django路由系統
    |    | -- wsgi.py    # Django遵循WSGI規範
    |
    | -- manage.py    # Django的管理功能
    |
    | -- templates/    # 使用IDE建立工程時會自動建立,用於存放模板文件(即HTML)

啓動該Django工程:django

# 在工程目錄下運行
python manage.py runserver host:port

2.三、Django建立APP及APP目錄詳解

建立APP的目的在於將業務邏輯分開,每一個具體的APP實現一個具體的業務。瀏覽器

使用如下命令建立APP:

python manage.py startapp app名稱

建立完APP後,將出現如下結構的目錄:

# 從APP目錄開始
APP名稱/
    |
    | -- migrations/    # 建立或修改數據庫表結構時會在該文件夾下建立記錄
    |
    | -- admin.py    # Django提供的後臺管理功能
    |
    | -- apps.py    # 用於配置當前的APP
    |
    | -- models.py    # Django提供的ORM,經過類便可建立數據庫結構
    |
    | -- tests.py    # 單元測試
    |
    | -- views.py    # 視圖文件,編寫業務代碼

2.四、Django配置模板路徑及靜態文件路徑

配置模板路徑:

# 在settings.py中的TEMPLATES = 下修改
'DIRS': [os.path.join(BASE_DIR, "templates")],

配置靜態文件路徑:

# 靜態文件目錄可命名爲static
# 在settings.py文件中的STATIC_URL = '/static/'下添加
STATICFILES_DIRS = (
    os.path.join(BASE_DIR, 'static'),
)

三、使用Django

3.一、Django請求的生命週期

鏈接Django請求的整個生命週期,咱們就能夠根據該週期來使用Django。

當用戶的請求到來時,首先到達的是Django的路由系統,Django根據路由系統裏面的配置把請求轉給相應的視圖函數,視圖函數根據請求的具體內容從模板或數據庫中提取數據以後通過渲染後返回給用戶。整個生命週期以下:

用戶請求 ---> 中間件 ---> 路由系統 ---> 視圖函數 ---> 模板渲染 ---> 展現給用戶最終結果

3.二、中間件

在Django中,中間件其實就是一個類,在請求到來和結束以後,Django會根據本身的規則在合適的時機執行中間件中相應的方法。

中間件在settings.py中的MIDDLEWARE = []中配置,裏面的每個項即爲一箇中間件。

自定義中間件:

# 在xx目錄下建立xxx.py文件

from django.utils.deprecation import MiddlewareMixin


class F1(MiddlewareMixin):

    # 中間件中能夠定義如下五種方法

    def process_request(self, request):
    # 請求來時首先經過該方法
        pass
    # 不能return,不然沒法到達Views函數

    def process_view(self, request, callback, callback_args, callback_kwargs):
    # 全部中間件的request方法執行完成,URL匹配成功並獲取Views函數的名稱和參數後執行該方法(Views函數不執行)
        pass

    def process_template_response(self, request, response):
    # 只有在Views函數的返回值中有render方法時執行
        pass

    def process_exception(self, request, exception):
    # 只有在Views函數出錯時執行
        pass

    def process_response(self, response):
    # 中間件其餘方法或Views函數執行完成後執行
        pass
        return response
    # 必須return response,不然前一箇中間件沒法獲取到返回值

# 以上方法的返回值能夠是None和HttpResponse對象。若是是None,則繼續按照Django定義的規則向下執行,若是是HttpResponse對象,則直接將該對象返回給用戶

# 在settings.py中註冊中間件
MIDDLEWARE = [
    'django.middleware.security.SecurityMiddleware',
    'django.contrib.sessions.middleware.SessionMiddleware',
    'django.middleware.common.CommonMiddleware',
    'django.middleware.csrf.CsrfViewMiddleware',
    'django.contrib.auth.middleware.AuthenticationMiddleware',
    'django.contrib.messages.middleware.MessageMiddleware',
    'django.middleware.clickjacking.XFrameOptionsMiddleware',
    'xx.xxx'    # 根據中間件須要在合適執行決定放置位置
]

中間件的整個執行過程:

20151210144704684

3.三、路由系統

Django的路由系統就是URL與視圖函數的對應關係,在urls.py文件中配置。Django支持一個URL對應一個視圖函數、一組URL(使用正則表達式)對應一個視圖函數。

一個URL對應一個視圖函數:

# 在urls.py文件中添加
urlpatterns = [
    path('admin/', admin.site.urls),    # Django自帶的後臺管理
     path('URL', 視圖函數),
]

一組URL對應一個視圖函數:

# 在urls.py文件中添加
urlpatterns = [
    re_path('URL帶正則表達式', 視圖函數),
]

e.g:
urlpatterns = [
    re_path('home-(\d+)', 視圖函數),
]
# 使用多少個正則表達式,就會向視圖函數傳遞相應數量的參數,視圖函數必須接收這些參數,能夠設置*args和**kwargs

# 推薦使用正則表達式分組
e.g:
urlpatterns = [
    re_path('home-(?<Pnid>\d+)', 視圖函數),
]

添加默認值:

# 在URL中添加默認值
urlpatterns = [
     path('URL', 視圖函數, {"xx": "xxx"}),
]

# 在視圖函數中必須接收該默認值
def func(request, xx):
    print(xx)

路由分發:

# 當APP增多時,不一樣的APP可能使用到相同的URL,這時若是都在urls.py中添加的話將照成衝突,咱們就可使用到Django的路由分發功能
# 在urls.py中添加
from django.urls import include
urlpatterns = [
    path('一類URL', include("APP名稱.urls")),
]
# 這時在對應APP目錄下建立urls.py文件編寫路由便可

e.g:
from django.urls import include
urlpatterns = [
    path('cmdb/', include("cmdb.urls")),
]
# 此時在瀏覽器訪問host:port/cmdb/URL

path和re_path可加name參數,爲該URL設置一個名稱:

urlpatterns = [
    path('URL', 視圖函數, name='自定義名稱'),
    re_path('URL', 視圖函數, name='自定義名稱'),
]

# 在HTML中可使用模板語言來調用該名稱
{% url "自定義名稱" 參數(隨便填,xxx=若是有正則) %}

命名空間:

name參數沒有做用域,Django在反解URL時,會在項目全局順序搜索,當查找到第一個name指定的URL時,當即返回,當不當心定義相同的name時,可能會致使URL反解錯誤,爲了不該錯誤發生,可以使用命名空間

# 在urls.py中添加
from django.urls import include
urlpatterns = [
    path('一類URL', include("APP名稱.urls"), namespace= "aaa"),
]

# 在對應APP目錄下建立的urls.py文件添加
from django.urls import path
from xxx import views

app_name = "xxx"

urlpatterns = [
    path('bbb/', views.xxx, name="index"),
]

# 這時,使用反解獲得的URL
print(reverse("xxx:index"))
# /aaabbb/

在Django中自動生成URL:

from django.urls import reverse
reverse('URL', args=(n,...))
reverse('URL', kwargs={})
# 使用此方法生成的URL將帶有後面第二個參數的內容

3.四、FBV與CBV

FBV即function、base、view,是URL與函數的對應,CBV即class、base、view,是URL與類的對應。

FBV路由編寫:

urlpatterns = [
    path('URL', 函數),
]

CBV路由編寫:

urlpatterns = [
    path('URL', 類.as_view()),
]

FBV函數編寫:

def func(request):
    pass
# request爲客戶端傳入的全部請求

CBV中的類編寫:

from django.views import View


class Foo(View):

    def get(self, request):
        # 傳入GET請求
        pass

    def post(self, request):
        # 傳入POST請求
        pass

FBV與CBV使用裝飾器:

# FBV使用裝飾器與平時同樣
# 裝飾器xxx
@xxx
def func(request):
    pass


# CBV使用裝飾器時,需進行以下操做
from django.utils.decorators import method_decorator

# 單個方法使用裝飾器
class Obj(views.View):

    @method_decorator(xxx)
    def get(self, request):
        pass

    def post(self, request):
        pass

@method_decorator(xxx, name="使用裝飾器的方法")
class Obj(views.View):

    def get(self, request):
        pass

    def post(self, request):
        pass

# 整個類使用裝飾器
@method_decorator(xxx, name="dispatch")
class Obj(views.View):

    def get(self, request):
        pass

    def post(self, request):
        pass

3.五、視圖函數

視圖函數用於處理用戶發送到服務端的請求,處理相應的業務,在相應APP目錄下的views.py文件中編寫。

def func(request):
    request.method    # 用於判斷客戶端傳入的請求類型,如GET、POST,值均爲大寫

    request.GET/POST    # 接收客戶端相應請求類型下的數據,字典模式

    request.POST.get()    # 由於請求中的數據爲字典類型,因此可使用get取相應key的value,這裏不推薦使用[],由於使用[]時若相應的key不存在則會報錯

    request.POST.getlist()    # 用於獲取返回值是多個數據,如checkbox的返回值

    obj = request.FILES.get()    # 上傳文件時,生成一個實例
    obj.name    # 獲取文件名
    obj.size    # 獲取文件的字節數
    obj.chunks    # 獲取文件的數據塊,當文件上傳時分爲一個個數據塊上傳,能夠循環該方法接收完整的文件數據,也能夠直接循環obj,Django內部將調用chunks

    request.path_info    # 獲取當前URL

# request在前端也能夠拿到,能夠經過模板語言使用

獲取用戶請求頭及請求主體信息:

# 用戶傳入的請求包含請求頭和請求主體信息,使用如下方法獲取所有信息
from django.core.handlers.wsgi import WSGIRequest
request.environ
# 將以字典形式返回全部的信息

# 直接獲取未通過Django處理的原生請求數據

# 獲取請求頭
request.Meta

# 獲取請求主體
request.body


# 如下方法屬於請求頭信息
request.method
request.path_info
request.COOKIES

# 如下方法屬於請求主體信息
request.GET
requets.POST
request.FILES

3.六、模板語言

Django的模板語言用於接收後臺返回的數據並將數據嵌入HTML中。

{{ xxx }}
# 用後臺返回的內容替換HTML

e.g:
<span>{{ xxx }}</span>

模板語言中取列表和字典的值:

# 取列表值
list = []
list.下標

# 取字典的值
dict = {}
dict.key

for循環:

{% for item in xxx %}
    ......
{% endfor %}

# for循環中有如下幾個方法
# forloop.counter,計數器
# forloop.revcounter,倒數計數器
# forloop.counter0,從0開始的計數器
# forloop.revcounter0,從0開始的倒數計數器
# forloop.first,是否第一個循環
# forloop.last,是否最後一個循環
# forloop.parentloop,父循環的以上6個信息

if語句:

{% if xxx %}
    ......
{% else %}
    ......
{% endif %}

使用模板語言循環字典:

# 循環字典的鍵
{% for item in dict.keys %}
{% endfor %}

# 循環字典的值
{% for item in dict.values %}
{% endfor %}

# 循環字典的鍵值對
{% for k, v in dict.items %}
{% endfor %}

模板的繼承:

# 建立模板HTML,通用部分寫HTML,改變的部分以下:
{% block 名稱 %}
{% endblock %}

# 須要使用模板的其餘HTML文件
{% extends "模板HTML" %}    # 聲明繼承的模板

{% block 模板中的block名稱 %}
    HTML代碼...
{% endblock %}
# 注意,只能繼承一個模板

導入模板組件:

能夠將HTML頁面中常用的部分設計成小組件,在其餘頁面須要使用的時候導入便可。

# 建立一個HTML文件,寫HTML代碼
# 須要引入時使用:
{% include "HTML文件" %}

自定義simple_tag:

自定義simple_tag容許用戶在模板語言中使用本身定義的Python函數,具體步驟以下,

1.在APP中建立templatetags目錄(Python Package)

2.在目錄中建立任意py文件

# 建立xxx.py文件
from django import template

register = template.Library()


@register.simple_tag
def func(x1, x2, …):
    ...

3.在使用自定義simple_tag的HTML文件中導入以前建立的xxx.py

{% load xxx %}

4.使用自定義simple_tag

{% func 參數1 參數2 …%}

注意:使用自定義simple_tag以前必須在settings.py中的INSTALLED_APPS中註冊該APP。

自定義filter:

自定義filter相似自定義simple_tag,具體步驟以下,

1.在APP中建立templatetags目錄(Python Package)

2.在目錄中建立任意py文件

# 建立xxx.py文件
from django import template

register = template.Library()


@register.filter
def func(x1, x2):
    ...

3.在使用自定義filter的HTML文件中導入以前建立的xxx.py

{% load xxx %}

4.使用自定義filter

{{ 參數1|func:參數2 }}
# 注意:函數的參數跟函數間不能有空格

自定義simple_tag與自定義filter的區別:

自定義simple_tag能夠傳入多個參數,可是不能做爲if語句的條件;自定義filter只能傳入兩個參數,可是能夠做爲if語句的條件使用

3.七、爲用戶返回結果

Django有如下三種方式能夠給用戶返回最終結果

# 返回字符串
from django.shortcuts import HttpResponse

return HttpResponse("字符串" or "字節")

# 返回模板文件(HTML)
from django.shortcuts import render

return render(request, "模板文件路徑", {字典,返回內容給模板語言})

# 返回一個URL
from django.shortcuts import redirect

return redirect("URL")

四、Cookie和Session

4.一、Cookie

Cookie是在HTTP協議下,服務器或腳本能夠維護客戶工做站上信息的一種方式。Cookie是由WEB服務器保存在用戶瀏覽器上的一個小文件,經過相似字典的鍵值對方式存儲有關用戶的信息,不管什麼時候用戶鏈接到服務器,WEB站點均可以訪問Cookie中的信息。

獲取Cookie:

def func(request):
    request.COOKIES["xxx"]
    request.COOKIES.get("xxx")

設置Cookie:

def func(request):
    rep = HttpResponse or rep = render(request, xx.html)
    rep.set_cookie(key, value, ...)

# 參數:
#      key                   -->    鍵
#      value                 -->    值
#      max_age=              -->    超時時間,秒
#      expires=              -->    超時時間,具體日期
#      path="/"              -->    Cookie生效的路勁,/表示根路徑,根路徑的Cookie能夠被任何頁面訪問
#      domain=               -->    Cookie生效的域名
#      secure=True/False     -->    HTTPS傳輸
#      httponly=True/False   -->    只能HTTP協議傳輸,沒法被JS獲取

注意:不設置Cookie超時時間時,Cookie在關閉瀏覽器前均有效。

將Cookie失效時間設置爲當前時間便可清除Cookie。

加密Cookie:

# 獲取加密Cookie
def func(request):
    request.get_signed_cookie(key, default=RAISE_ERROR,salt="加密鹽", max_age=)

# 設置加密Cookie
def func(request):
    rep = HttpResponse() or rep = render(request, xx.html)
    rep.set_signed_cookie(key, value, salt="加密鹽", ...)

注意:因爲Cookie存儲與客戶端,因此在基於Cookie的用戶認證中,爲了安全不建議將敏感信息放置於Cookie中。

4.二、Session

Session,在計算機中,尤爲是在網絡應用中,被稱爲「會話控制」。Session對象存儲特定用戶會話過程當中所需的屬性及配置信息。這樣,當用戶在應用程序的 Web 頁之間跳轉時,存儲在 Session 對象中的變量將不會丟失,而是在整個用戶會話中一直存在下去。當用戶請求來自應用程序的 Web 頁時,若是該用戶尚未會話,則 Web 服務器將自動建立一個 Session 對象。當會話過時或被放棄後,服務器將終止該會話。

與Cookie相同的是,Session也是經過鍵值對的形式保存信息;而與Cookie不一樣的是,Session保存在服務器端而非客戶端。可是Session必須與Cookie配合使用,Session會將該項生成的一段隨機字符串保存在Cookie中,其餘信息則保存在服務端。

在Django中,默認狀況下Session保存在Django自帶的數據庫中,因此在使用Session前必須先進行建立數據庫的操做。

Django中Session的使用:

def func(request):

    # 獲取Session
    request.session["xxx"]
    request.session.get("xxx")

    # 設置Session
    request.session["xxx"] = xxx
    request.session.setdefault("xxx", xxx)    # 不存在則設置

    # 刪除Session
    del request.session["xxx"]

    # 全部鍵、值、鍵值對操做
    request.session.keys()
    request.session.values()
    request.session.items()
    request.session.iterkeys()
    request.session.itervalues()
    request.session.iteritems()

    # Session隨機字符串
    request.session.session_key()

    # 刪除全部失效日期小於當前日期的Session
    request.session.clear_expired()

    # 檢查用戶Session隨機字符串在數據庫中是否存在
    request.session.exists("session_key")

    # 刪除當前用戶全部的Session
    request.session.clear()
    request.session.delete("session_key")

    # 設置Session失效時間
    request.session.set_expiry(value)
    # 參數:
    #     value爲整數                    -->   Session會在設置的秒數後失效
    #     value爲datatime或timedelta  -->   Session會在這個時間後失效
    #     value爲0                    -->   Session會在關閉瀏覽器時失效
    #     value爲None                 -->   Session依賴settings.py中設置的失效策略,默認爲兩週

settings.py中可配置Session默認行爲:

# 引擎(默認)
SESSION_ENGINE = 'django.contrib.sessions.backends.db'

# Session的cookie保存在瀏覽器上時的key,即:sessionid=隨機字符串(默認)
SESSION_COOKIE_NAME = "sessionid"

# Session的cookie保存的路徑(默認)
SESSION_COOKIE_PATH = "/" 

# Session的cookie保存的域名(默認)
SESSION_COOKIE_DOMAIN = None

# 是否Https傳輸cookie(默認)
SESSION_COOKIE_SECURE = False

# 是否Session的cookie只支持http傳輸(默認)

# Session的cookie失效日期(2周)(默認)
SESSION_COOKIE_AGE = 1209600

# 是否關閉瀏覽器使得Session過時(默認)
SESSION_EXPIRE_AT_BROWSER_CLOSE = False

# 是否每次請求都保存Session,默認修改以後才保存(默認)
SESSION_SAVE_EVERY_REQUEST = False

Django中默認將Session保存在自帶數據庫的django_session表中,也能夠將Session保存在其餘地方,Django提供瞭如下5種類型供開發者使用:

  • 數據庫,默認保存位置
  • 緩存
  • 文件
  • 緩存+數據庫
  • 加密Cookie

經過配置settings.py中的SESSION_ENGINE = 「」便可修改保存方式

# 數據庫
SESSION_ENGINE = 'django.contrib.sessions.backends.db'

# 緩存
SESSION_ENGINE = 'django.contrib.sessions.backends.cache'
SESSION_CACHE_ALIAS = 'default'    # 使用的緩存別名(默認內存緩存,也能夠是memcache),此處別名依賴緩存的設置

# 文件
SESSION_ENGINE = 'django.contrib.sessions.backends.file'
SESSION_FILE_PATH = None    # 緩存文件路徑,若是爲None,則使用tempfile模塊獲取一個臨時地址tempfile.gettempdir()

# 緩存+數據庫,數據庫用於作持久化,緩存用於提升效率
SESSION_ENGINE = 'django.contrib.sessions.backends.cached_db'

# 加密Cookie
SESSION_ENGINE = 'django.contrib.sessions.backends.signed_cookies'

五、XSS和CSRF

5.一、XSS

XSS全稱跨站腳本攻擊,是一種在WEB應用中的計算機安全漏洞,它容許惡意WEB用戶將代碼(如HTML代碼和JS腳本)植入到提供給其餘用戶使用的頁面中。

爲了防止XSS攻擊,Django後臺在返回給前臺的數據中出現如HTML代碼或JS腳本的字符串時,在前臺將按字符串顯示,而不會將代碼解析未HTML或腳本。當咱們須要將返回的代碼或腳本實現功能而不已字符串顯示時,可使用以下方法:

# 後臺Views函數
from django.shortcuts import HttpResponse
from django.utils.safestring import mark_safe


def func(request):
    xxx = "<a href='www.baidu.com'>百度一下</a>"
    xxx = mark_safe(xxx)
    return HttpResponse(xxx)

# 前臺HTML文件,使用模板語言
{{ xxx|safe }}

5.二、CSRF

CSRF(Cross-site request forgery)跨站請求僞造,也被稱爲「One Click Attack」或者「Session Riding」,是一種對網站的惡意利用。儘管聽起來像跨站腳本XSS,但它與XSS很是不一樣,XSS利用站點內的信任用戶,而CSRF則經過假裝來自受信任用戶的請求來利用受信任的網站。

Django中的中間件django.middleware.csrf.CsrfViewMiddleware提供了全局防止CSRF攻擊的功能,在Views函數中也能夠設置局部防止CSRF攻擊的功能。

全局防止CSRF:

啓用中間件django.middleware.csrf.CsrfViewMiddleware

局部防止CSRF:

from django.views.decorators.csrf import csrf_exempt, csrf_protect


# 當前函數設置防止CSRF攻擊,即便中間件沒有啓用
@csrf_protect
def func(request):
    ...


# 當前函數取消防止CSRF攻擊,即便中間件啓用
@csrf_exempt
def func(request):
    ...

前臺設置csrf token

form表單:

<form>
    {% csrf_token %}
</form>

Ajax:

csrf token也保存在cookie中,因此在Ajax提交數據時可使用保存在cookie中的csrf token

1.單個Ajax設置

$.ajax({
    headers:{"X-CSRFtoken": $.cookie('csrftoken')},
})

2.全局Ajax設置

$.ajaxSetup({
    beforeSend: function(xhr, settings){
        xhr.setRequestHeader("X-CSRFtoken", $.cookie("csrftoken"));
    }
});

六、Django使用緩存

若是每次請求時都去數據庫中進行相應的操做,在訪問量大時,耗時必然會更加明顯。對於這種情況最簡單的解決方法既是使用緩存,將某個Views的返回值保存在內存或者緩存服務器中,當必定的時間內有用戶訪問時,直接從內存或緩存中讀取數據返回給用戶。

Django中提供瞭如下6種方式使用緩存:

  • 開發調試
  • 內存
  • 文件
  • 數據庫
  • Memcache(python-memcached模塊)
  • Memcache(pylibmc模塊)

緩存的配置也在settings.py中進行:

# 開發模式
CACHES = {
    'default': {
        'BACKEND': 'django.core.cache.backends.dummy.DummyCache',    # 引擎
        'TIMEOUT': 300,    # 緩存超時時間(默認300,None表示永不過時,0表示當即過時)
        'OPTIONS':{
            'MAX_ENTRIES': 300,    # 最大緩存個數(默認300)
            'CULL_FREQUENCY': 3,    # 緩存到達最大個數以後,剔除緩存個數的比例,即:1/CULL_FREQUENCY(默認3)
        },
        'KEY_PREFIX': ' ',    # 緩存key的前綴(默認空)
        'VERSION': 1,    # 緩存key的版本(默認1)
        'KEY_FUNCTION': 函數名,    # 生成key的函數(默認函數會生成爲:【前綴:版本:key】)
    }
}

# 內存,將內容保存在內存的變量中
CACHES = {
    'default': {
        'BACKEND': 'django.core.cache.backends.locmem.LocMemCache',
        'LOCATION': 'unique-snowflake',
        ...
    }
}

# 文件,將內容保存在文件中
CACHES = {
    'default': {
        'BACKEND': 'django.core.cache.backends.filebased.FileBasedCache',
        'LOCATION': '文件路徑',
        ...
    }
}

#數據庫,將內容保存在數據庫中
CACHES = {
    'default': {
        'BACKEND': 'django.core.cache.backends.db.DatabaseCache',
        'LOCATION': '表名',
    }
}

# Memcache(python-memcached模塊),使用python-memcached模塊鏈接Memcache
CACHES = {
    'default': {
        'BACKEND': 'django.core.cache.backends.memcached.MemcachedCache',
        'LOCATION': 'Memcache服務器',
        # 同時鏈接多臺Memcache服務器
        'LOCATION': ['服務器1', '服務器2', ...]
        # 多臺Memcache服務器權重設置
         'LOCATION': [('服務器1', 10), ('服務器2', 11), ...]
    }
}

# Memcache(pylibmc模塊),使用pylibmc模塊鏈接Memcache
CACHES = {
    'default': {
        'BACKEND': 'django.core.cache.backends.memcached.PyLibMCCache',
        'LOCATION': 'Memcache服務器',
        # 同時鏈接多臺Memcache服務器
        'LOCATION': ['服務器1', '服務器2', ...]
        # 多臺Memcache服務器權重設置
         'LOCATION': [('服務器1', 10), ('服務器2', 11), ...]
    }
}

Django也可使用Redis緩存,但必須依賴django-redis模塊(使用pip安裝):

CACHES = {
    "default": {
        "BACKEND": "django_redis.cache.RedisCache",
        "LOCATION": "redis://127.0.0.1:6379",
        "OPTIONS": {
            "CLIENT_CLASS": "django_redis.client.DefaultClient",
            "CONNECTION_POOL_KWARGS": {"max_connections": 100}
            "PASSWORD": "密碼",
        }
    }
}

七、信號

Django中提供了「信號調度」,即容許在某些動做發生時,執行一些特定的操做。

內置信號:

Model signals
    pre_init                      # django的modal執行其構造方法前,自動觸發
    post_init                     # django的modal執行其構造方法後,自動觸發
    pre_save                      # django的modal對象保存前,自動觸發
    post_save                     # django的modal對象保存後,自動觸發
    pre_delete                    # django的modal對象刪除前,自動觸發
    post_delete                   # django的modal對象刪除後,自動觸發
    m2m_changed                   # django的modal中使用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            # 建立數據庫鏈接時,自動觸發

使用內置信號:

# 能夠新建目錄或py文件,而後在工程文件夾下的__init__.py中導入,這樣在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):
    pass

信號.connect(callback)

# 也可使用裝飾器來運行信號
from django.dispatch import receiver


@receiver(信號)
def my_callback(sender, **kwargs):
    pass

自定義信號:

# 定義信號
import django.dispatch
xxx = django.dispatch.Signal(providing_args=[參數1, 參數2, ...])

# 註冊信號
def callback(sender, **kwargs):
    pass
 
xxx.connect(callback)

# 觸發信號,因爲內置信號的觸發者已集成在Django中,因此會自動調用,而自定義信號則須要開發者在須要的位置觸發
from 路徑 import xxx
 
xxx.send(sender='觸發者', 參數1 = , 參數2 = , ...)
相關文章
相關標籤/搜索