Skip to content

Instantly share code, notes, and snippets.

@faelp22
Last active September 29, 2019 00:29
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save faelp22/3534584c38235fa0444fe370ff158456 to your computer and use it in GitHub Desktop.
Save faelp22/3534584c38235fa0444fe370ff158456 to your computer and use it in GitHub Desktop.
Uso esse Middleware para bloquear todas as urls e libero só algumas, com isso evito ficar colocando o decorador @login_required.
import urllib.parse
from django.conf import settings
from django.urls import resolve, reverse
from django.shortcuts import redirect
'''
Isael Sousa <faelp22@gmail.com>
v: 3
Data: 27/09/2019
Middleware responsavel por bloquear todas as url e liberar outras
settings.py exemplo
MIDDLEWARE = [
...
'core.middleware.login.LoginRequiredMiddleware',
...
]
LOGIN_URL = 'login'
LOGOUT_URL = 'logout'
LOGIN_REDIRECT_URL = 'core:core_index'
LOGOUT_REDIRECT_URL = LOGIN_URL
# urls liberadas
LOGIN_IGNORE_URL = [
'core:core_painel',
LOGIN_URL,
LOGOUT_URL,
]
'''
class LoginRequiredMiddleware:
def __init__(self, get_response):
self.get_response = get_response
def __call__(self, request):
response = self.get_response(request)
return response
def process_view(self, request, view_func, view_args, view_kwargs):
'''
Verifica se tem namespace para o resolve()
'''
def resolver_check(value):
if not value.namespace:
return value.url_name
return value.namespace + ':' + value.url_name
'''
Se já está logado deixo passar
'''
if request.user.is_authenticated():
return None
'''
Se a url está liberada deixo passar
'''
if resolver_check(resolve(request.path_info)) in settings.LOGIN_IGNORE_URL:
return None
'''
Mando para tela de login
'''
url = reverse(settings.LOGIN_URL) + "?next=" + urllib.parse.quote(request.get_full_path())
return redirect(url)
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment