Django messages框架

一.簡介

  在網頁應用中,你常常須要在處理完表單或其它類型的用戶輸入後,顯示一個通知消息(也叫作「flash message」)給用戶html

對於這個功能,Django 提供基於Cookie 和會話的消息,不管是匿名用戶仍是認證的用戶。前端

其消息框架容許你臨時將消息存儲在請求中,並在接下來的請求(一般就是下一個請求)中提取它們並顯示。每一個消息都帶有一個特定level 標籤,表示其優先級(例如infowarning 或errorpython

二.啓用消息框架 

消息框架的實現經過一箇中間件 類和對應的context processor。django

django-admin startproject 建立的默認settings.py  已經包含啓用消息框架功能須要的全部的設置:後端

  • INSTALLED_APPS 中的'django.contrib.messages'瀏覽器

  • MIDDLEWARE_CLASSES 中的'django.contrib.sessions.middleware.SessionMiddleware' 和'django.contrib.messages.middleware.MessageMiddleware'安全

    默認的後端存儲 依賴sessions因此MIDDLEWARE_CLASSES 中必須啓用SessionMiddleware 並出如今MessageMiddleware 以前。cookie

  • TEMPLATES 設置中定義的DjangoTemplates 的'context_processors' 選項包含'django.contrib.messages.context_processors.messages'session

若是你不想使用消息框架,你能夠刪除INSTALLED_APPS 中的 'django.contrib.messages'MIDDLEWARE_CLASSES 中的MessageMiddleware 和TEMPLATES 中的messages context processo框架

2.1 配置消息框架引擎

  

消息框架可使用不一樣的後臺存儲臨時消息。

Django 在django.contrib.messages 中提供三個內建的存儲類:

class storage.session.SessionStorage

這個類存儲全部的消息於請求的會話中。所以,它要求啓用Django 的contrib.sessions 應用。

class storage.cookie.CookieStorage

這個類存儲消息數據於與Cookie 中(已經用一個安全的哈希進行簽名以防止篡改)以在請求之間傳遞消息。若是Cookie 數據的大小將超過2048 字節,將丟棄舊的消息。

class storage.fallback.FallbackStorage

這個類首先使用CookieStorage,若是消息塞不進一個Cookie 中則使用SessionStorage。 它一樣要求啓用Django 的contrib.sessions 應用。

這個行爲避免每次都寫會話。在一般狀況下,它提供的性能應該是最好的。

FallbackStorage 是默認的存儲類。若是它不適合你的須要,你能夠經過設置 MESSAGE_STORAGE 爲它的完整導入路徑選擇另一個存儲類,例如:

MESSAGE_STORAGE = 'django.contrib.messages.storage.cookie.CookieStorage'

3.3 消息級別

  消息框架的級別是可配置的,與Python logging 模塊相似。消息的級別可讓你根據類型進行分組,這樣它們可以在不一樣的視圖和模板中過濾或顯示出來

django.contrib.messages 導入的內建級別有:

Constant Purpose
DEBUG Development-related messages that will be ignored (or removed) in a production deployment
INFO Informational messages for the user
SUCCESS An action was successful, e.g. 「Your profile was updated successfully」
WARNING A failure did not occur but may be imminent
ERROR An action was not successful or some other failure occurred

MESSAGE_LEVEL 設置能夠用來改變記錄的最小級別(它還能夠在每一個請求中修改)。小於這個級別的消息將被忽略。

若要修改消息級別的默認標籤,設置MESSAGE_TAGS爲包含你想要修改的級別的字典

from django.contrib.messages import constants as messages
MESSAGE_TAGS = {
    messages.INFO: '',
    50: 'critical',
}

3.3 在視圖及模板中使用

add_message(request, level, message, extra_tags='', fail_silently=False)

例 

新增消息

from django.contrib import messages
messages.add_message(request, messages.INFO, 'Hello world.')

有幾個快捷方法提供標準的方式來新增消息並帶有常見的標籤(這些標籤一般表示消息的HTML 類型)

messages.debug(request, '%s SQL statements were executed.' % count)
messages.info(request, 'Three credits remain in your account.')
messages.success(request, 'Profile details updated.')
messages.warning(request, 'Your account expires in three days.')
messages.error(request, 'Document deleted.')

3.4 顯示消息

get_messages(request)

在你的模板中,像下面這樣使用:

{% if messages %}
<ul class="messages">
    {% for message in messages %}
    <li{% if message.tags %} class="{{ message.tags }}"{% endif %}>{{ message }}</li>
    {% endfor %}
</ul>
{% endif %}

三.配置使用

  以上只是簡單舉例使用,看更詳細文檔請參考 https://docs.djangoproject.com/en/1.10/ref/contrib/messages/

  在生產使用中咱們能夠把它整合成一個模塊便於調用,結合前端顯示當有錯誤或者其它信息時瀏覽器能夠alert消息

from django.contrib.messages import constants as message_constants

MESSAGE_LEVEL = message_constants.INFO



TEMPLATES = [
    {
        'BACKEND': 'django.template.backends.django.DjangoTemplates',
        'DIRS': [os.path.join(BASE_DIR, "templates")],
        'APP_DIRS': True,
        'OPTIONS': {
            'context_processors': [
                'django.template.context_processors.debug',
                'django.template.context_processors.request',
                'django.contrib.auth.context_processors.auth',
                'django.contrib.messages.context_processors.messages',
            ],
        },
    },
]
settings
#!/usr/bin/env python
# -*- coding: utf-8 -*-
from django.contrib import messages
def flash(request, title, text, level='info'):
    """
    利用django的message系統發送一個信息。
    """
    level_map = {
        'info': messages.INFO,
        'debug': messages.DEBUG,
        'success': messages.SUCCESS,
        'warning': messages.WARNING,
        'error': messages.ERROR
    }

    level = level_map[level]

    messages.add_message(request, level, text, extra_tags=title)
    return 'ok'
message method
{% if messages %}
<script>
    {% for msg in messages %}
        alert('{{ msg.message }}');
    {% endfor %}
</script>
{% endif %}
前端顯示

VIEWS調用

 result = XXXXX
      if result:
         flash(request,"success", "成功!")
      else:
         flash(request,"error",  "。。。。")
相關文章
相關標籤/搜索