1, django Fluxograma do Processo de middleware
2, o papel do middleware
documentação oficial disse: .. Middleware é uma estrutura de ganchos em pedido / resposta do Django processamento É uma luz, de baixo nível "plugin" do sistema para alterar globalmente entrada ou saída de Django (Middleware está ligado ao pedido Django / estrutura de processamento de resposta é um peso leve, baixos níveis de "plug-in" do sistema para entrada de mudança global ou saída Django.)
Isto é, quando você deseja exibir antes e após a execução do complemento de entrada e de saída ou determinados valores de exclusão, você pode usar o middleware.
cenário comum é fazer com que todos o nome do usuário solicitado para cada solicitação, ou quer alcançar na mensagem de saída, os seguintes efeitos:
Primeiro, design: a tabela no banco de dados para o novo conteúdo da ficha de notificação, o tempo de destinatário (tabela de chave externa associada ao usuário), a notificação de um aviso, informando o estado (estado 0 por padrão, não lida; quando um utilizador clica para ler, modificar o estado é 1, indicando uma leitura)
Porque notificar cada página terá um bar, mas depois de ler o estado notificações tornam-se ler, observe o número de exibição se torna 0, podemos ver o número de notificação não lida é variável, a qualquer momento, de modo que para cada vezes, as solicitações são obrigados a consultar o banco de dados, o número de notificações não lidas para este usuário é quanto, antes de ser passado para o modelo apresentado.
Como cada pedido deve adicionar um usuário a digitar o nome e número de notificação não lida antes de ser passado para a visão, de modo que este é um middleware muito simples.
3, a utilização de middleware
- Py criar um novo arquivo na APP, conforme segue middleware.py:
- função de gravação lógica desejada (middleware middleware.py adquire o nome de arquivo da sessão do usuário e, em seguida, consulta a tabela ID de usuário para esse usuário, em seguida, o ID do usuário da tabela de notificação de consulta de status de notificação do usuário é o número de objetos não lidas e o número de consultas ao pedido por escrito):
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
Desde que nós estamos adicionando dados antes de realizar a visão, por isso precisamos reescrever a função process_request
- E, em seguida, declarar o middleware no caminho do arquivo settings.py: rbvc.middleware.count_notice_num (.. nome App do nome dos nomes de classe ou função de arquivo)
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',
]
- Em seguida, reescrever a função view retorna um modelo render (Novo caminho nome do arquivo py gratuito, fácil multiplexing)
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)
- Finalmente, o local original de usar tornam a vista de tudo mp_render reescrita personalizado (nota que antes do uso, o mp_render função descrita acima introduzindo novo nome caminho do py arquivo)
Todos tiveram um retorno render (pedido, '***. Html', os moradores ()), o mp_render reescrita retorno (request, '***. Html', os moradores ()) permanece a mesma lógica, completando assim na base do projeto original, adicionando uma vista frontal de um nome de usuário, número de usuário de mensagens não lidas, antes de ser passado para o modelo executado após cada solicitação.
<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>
Este modelo pode agora identificar variáveis notice_num.