Existe um django.middleware.csrf.CsrfViewMiddleware
middleware no Django que fornece verificação global de csrf. Seu princípio é <form>
gerar um rótulo oculto no <input>
rótulo, enviá-lo oculto ao enviar o formulário <input>
e o servidor verifica se esse campo está correto.
As etapas oficiais da operação csrf são:
- Em
MIDDLEWARE_CLASSES
adiçãodjango.middleware.csrf.CsrfViewMiddleware
, a proteção csrf global aberta. - Para o formulário do POST na estação
<form>
, adicione uma{% csrf_token %}
marca de modelo à marca no modelo. - Certifique-se de usar o
django.template.context_processors.csrf
processador de contexto na função de exibição correspondente . Existem duas maneiras de obter:
(1) UseRequestContext
ou use diretamente a visão comum, elas serão automaticamentecsrf_token
adicionadas ao contexto do modelo.
retorne render_to_response ("xxx.html", context_instance = RequestContext (request))
(2). Importe e use manualmente o processador para gerar o token CSRF e adicioná-lo ao contexto do modelo. Por exemplo:
from django.shortcuts import render_to_response
de django.template.context_processors import csrf
def my_view (request):
c = {}
c.update (csrf (request))
# ... veja o código aqui
retorne render_to_response ("a_template.html" c)
No entanto, a importação manual é complicada e dificulta a manutenção do código, e RequestContext
não é bom de usar , e a documentação do Django 1.8 afirma que context_instance
será descartada após o 1.8.
Como devemos lidar com csrf_token
isso? De fato, o Django fornece uma função de atalho para lidar com esse problema. Um exemplo de
django.shortcuts.render
configuração do context_instance
padrão internamente RequestContext
. A chamada render
pode ser csrf_token
adicionada automaticamente ao contexto.
Existem alguns blogs na Internet que podem ser settings
configurados para TEMPLATE_CONTEXT_PROCESSORS
obter um csrf_token
preenchimento global para o contexto.
Mas, depois do meu experimento, descobri que não é fácil de usar: se um amigo souber o motivo, também gostaria de informá-lo.
Eu settings
configurei assim:
TEMPLATE_CONTEXT_PROCESSORS = global_settings.TEMPLATE_CONTEXT_PROCESSORS + (
'django.core.context_processors.csrf',
)
----------------------------------------------------------------------------------------------------------------------------------------------------------------------------
自此了解到要想django自带的csrf组件生效,要满足以上三个条件
- Em
MIDDLEWARE_CLASSES
adiçãodjango.middleware.csrf.CsrfViewMiddleware
, a proteção csrf global aberta. - Para o formulário do POST na estação
<form>
, adicione uma{% csrf_token %}
marca de modelo à marca no modelo. - Renderizar vista com função de renderização