Django fornecendo credenciais de login em qualquer URL de visualização
Pergunta
Existe alguma maneira no Django de realizar login usando as credenciais fornecidas ao acessar qualquer view na aplicação?
Minha motivação aqui é o monitoramento de disponibilidade usando um serviço como Pingdom.A maioria dos URLs que desejo validar sua disponibilidade são decorados com um @login_required
o que torna impossível o acesso, a menos que eu tenha feito login anteriormente.
Minha solução ideal será uma forma de acessar minhas visualizações enquanto fornece credenciais nos parâmetros GET ou POST.Outra alternativa provavelmente poderia ser um serviço de monitoramento de tempo de atividade do site que suporte o login e a aquisição de uma sessão antes de acessar o URL em questão.
Atualizar
Graças à direção de @Filip Dupanović e ao código de aqui meu middleware simples de trabalho é assim:
from django.contrib.auth import authenticate, login
class AuthenticationEverywhereMiddleware(object):
"""
Middleware to allow logging in by supplying login credentials in any URL
"""
def process_request(self, request):
if (request.GET.get('authenticateEverywhere','') == 'GET'):
username = request.GET['username']
password = request.GET['password']
user = authenticate(username=username, password=password)
if user is not None:
if user.is_active:
login(request, user)
Eu adicionei o parâmetro de disparo authenticateEverywhere
para evitar possíveis conflitos com visualizações que possam usar username
ou password
parâmetros.
Solução
Você certamente pode!Você precisará escrever um costume classe de middleware que implementa um costume process_request
método onde você poderá inspecionar o objeto da solicitação, obter as credenciais e conectar o usuário antes que a solicitação seja roteada para uma visualização decorada com login_required
.