Aprenda a usar personalizado Django middleware de notas (para atingir a mensagem de estação simples)

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.

Publicado 24 artigos originais · ganhou elogios 30 · vê 50000 +

Acho que você gosta

Origin blog.csdn.net/yufen9987/article/details/90287268
Recomendado
Clasificación