1、Djangoのプロセスフローチャートミドルウェア
2、ミドルウェアの役割
公式ドキュメントは言った:..ミドルウェアは、それがグローバル(ミドルウェアはDjangoのリクエスト/レスポンスの処理フレームワークに接続されているDjangoの入力または出力を変更するためのシステムを「プラグイン」光、低レベルだ処理Djangoのリクエスト/レスポンスにフックのフレームワークでありますそれは軽量、低レベルである「プラグイン」グローバル変更入力または出力のDjangoのためのシステム)。
入力と出力の追加または削除、特定の値を実行した後、あなたがミドルウェアを使用する前に、表示したい場合には、あります。
一般的なシナリオは、要求ごとに要求されたすべてのユーザー名を取得、または送信メッセージ、次のような効果に達成したいことです。
まず、デザイン:デフォルトで通知レコードの新しい内容のためのデータベース内のテーブル、受信者(ユーザに関連付けられた外部キーテーブル)の時、予告の通知、状態を知らせる(状態0、未読。ユーザは、読み取り状態が1である変更、読み出しを指示するためにクリックしたとき)
読まれるようになるバーを持つことになり、各ページに通知するので、しかし、通知の状態を読んだ後、ディスプレイの数が0になった通知は、我々は未読通知の数はすべてのためにそう、いつでも変数で見ることができます倍の要求がデータベースを照会するために必要とされ、このユーザーの未読の通知の数が表示されるテンプレートに渡される前に、どのくらいです。
各要求は、ビューに渡される前に未読通知の名前と電話番号を入力するようにユーザを追加する必要があるため、これは非常に単純なミドルウェアです。
3、ミドルウェアの使用
- middleware.py次のようにPyが、APPの新しいファイルを作成します。
- 書き込み所望の論理機能(middleware.pyミドルウェアは、ユーザセッションからファイル名を取得し、このユーザのユーザIDテーブルを照会し、ユーザ通知ステータスクエリ通知テーブルのユーザIDは、未読のオブジェクトの数であり、そして書面による要求へのクエリの数):
from django.utils.deprecation import MiddlewareMixin
from web import models
from rbvc.models import UserInfo
class count_notice_num(MiddlewareMixin):
def process_request(self,request):
try:
self.username = request.session['username']
except:
return None
self.user_id = UserInfo.objects.get(username=self.username).id
self.notice_num = models.Notice.objects.filter(userinfo_id=self.user_id).filter(has_read= 0).count()
if self.notice_num == 0:
self.notice_num = ''
request.notice_num = self.notice_num
return None
我々は、関数process一を書き換える必要があるので、ビューを実行する前にデータを追加しているので、
- そして、settings.pyファイルパスにミドルウェアを宣言:rbvc.middleware.count_notice_numを(..クラスまたは関数名のファイル名のアプリケーション名)
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',
'rbvc.middleware.RBACMiddleware',
'rbvc.middleware.count_notice_num',
]
- 次に、テンプレートのレンダリング(新PYファイル名パス無料、簡単に多重化)ビュー機能リターンを書き換えます
from django.shortcuts import render
def mp_render(request, template, context={}):
try:
context['username'] =request.session['username']
context['notice_num']=request.notice_num
except:
pass
return render(request,template, context)
- 最後に、使用して、元の場所には、すべてのカスタム書き換えmp_render(ファイルPYの新しいパス名を導入する。なお、使用する前に、前述した機能のmp_render)のビューをレンダリング
すべては( '***。htmlの'、地元の人々()要求を)、書き換えリターンmp_renderリターンがレンダリングていた(要求、 '***。htmlの'、地元の人々())ので、同じロジックを残りの完了元のプロジェクトごとに、各リクエストの後に実行テンプレートに渡される前に、ユーザー名、未読メッセージの利用者数の正面図を追加。
<a class="user-menu right" href="/notice/list">
通知
<i class="fa fa-envelope-o" aria-hidden="true"></i>
<span class="badge bg-danger">{{ notice_num }}</span>
</a>
このテンプレートは、今notice_num変数を識別することができます。