template - Django: ¿Cómo puedo aplicar el decorador login_required a todo mi sitio(excluyendo los medios estáticos)?
login django (8)
El example proporciona un fragmento de una vista de nivel de aplicación, pero ¿qué sucede si tengo muchas entradas diferentes (y algunas que no son de aplicación) en mi archivo "urls.py", incluidas las plantillas? ¿Cómo puedo aplicar este decorador login_required a cada uno de ellos?
(r''^foo/(?P<slug>[-/w]+)/$'', ''bugs.views.bug_detail''),
(r''^$'', ''django.views.generic.simple.direct_to_template'', {''template'':''homepage.html''}),
Además de meder omuraliev responda si desea una url exenta como esta (con regexp):
url(r''^my/url/(?P<pk>[0-9]+)/$'', views.my_view, name=''my_url'')
Añádelo a la lista EXEMPT_URLS de esta manera:
LOGIN_EXEMPT_URLS = [r''^my/url/([0-9]+)/$'']
r ''..'' al principio de la cadena necesaria.
Aquí está el clásico LoginRequiredMiddleware
para Django 1.10+:
from django.utils.deprecation import MiddlewareMixin
class LoginRequiredMiddleware(MiddlewareMixin):
"""
Middleware that requires a user to be authenticated to view any page other
than LOGIN_URL. Exemptions to this requirement can optionally be specified
in settings via a list of regular expressions in LOGIN_EXEMPT_URLS (which
you can copy from your urls.py).
"""
def process_request(self, request):
assert hasattr(request, ''user''), """
The Login Required middleware needs to be after AuthenticationMiddleware.
Also make sure to include the template context_processor:
''django.contrib.auth.context_processors.auth''."""
if not request.user.is_authenticated:
path = request.path_info.lstrip(''/'')
if not any(m.match(path) for m in EXEMPT_URLS):
return HttpResponseRedirect(settings.LOGIN_URL)
Diferencias notables:
-
path.to.LoginRequiredMiddleware
debe incluirse enMIDDLEWARE
noMIDDLEWARE_CLASSES
en settings.py. -
is_authenticated
es un bool no un método. - Consulte la docs para obtener más información (aunque algunas partes no son muy claras).
Aquí hay un ejemplo de middleware de nuevo estilo en Django 1.10+:
from django.contrib.auth.decorators import login_required
from django.urls import reverse
def login_required_middleware(get_response):
"""
Require user to be logged in for all views.
"""
exceptions = {''/admin/login/''}
def middleware(request):
if request.path in exceptions:
return get_response(request)
return login_required(get_response, login_url=reverse(''admin:login''))(request)
return middleware
Este ejemplo exime el formulario de inicio de sesión del administrador para evitar el bucle de redirección, y utiliza ese formulario como la URL de inicio de sesión.
Aquí hay un middleware ligeramente más corto.
from django.contrib.auth.decorators import login_required
class LoginRequiredMiddleware(object):
def process_view(self, request, view_func, view_args, view_kwargs):
if not getattr(view_func, ''login_required'', True):
return None
return login_required(view_func)(request, *view_args, **view_kwargs)
Tendrá que establecer "login_required" en False en cada vista que no necesita iniciar sesión para ver:
Vistas de funciones:
def someview(request, *args, **kwargs):
# body of view
someview.login_required = False
Vistas basadas en la clase:
class SomeView(View):
login_required = False
# body of view
#or
class SomeView(View):
# body of view
someview = SomeView.as_view()
someview.login_required = False
Esto significa que tendrás que hacer algo con las vistas de inicio de sesión, pero de todos modos siempre termino escribiendo mi propio backend automático.
Para aquellos que han llegado más tarde a esto, puede encontrar que django-stronghold se adapta bien a su caso de uso. Puede incluir en la lista blanca cualquier URL que desee que sea pública, el resto son necesarios para iniciar sesión.
Solté esto en un archivo middleware.py
en la raíz de mi proyecto (tomado de http://onecreativeblog.com/post/59051248/django-login-required-middleware )
from django.http import HttpResponseRedirect
from django.conf import settings
from re import compile
EXEMPT_URLS = [compile(settings.LOGIN_URL.lstrip(''/''))]
if hasattr(settings, ''LOGIN_EXEMPT_URLS''):
EXEMPT_URLS += [compile(expr) for expr in settings.LOGIN_EXEMPT_URLS]
class LoginRequiredMiddleware:
"""
Middleware that requires a user to be authenticated to view any page other
than LOGIN_URL. Exemptions to this requirement can optionally be specified
in settings via a list of regular expressions in LOGIN_EXEMPT_URLS (which
you can copy from your urls.py).
Requires authentication middleware and template context processors to be
loaded. You''ll get an error if they aren''t.
"""
def process_request(self, request):
assert hasattr(request, ''user''), "The Login Required middleware/
requires authentication middleware to be installed. Edit your/
MIDDLEWARE_CLASSES setting to insert/
''django.contrib.auth.middlware.AuthenticationMiddleware''. If that doesn''t/
work, ensure your TEMPLATE_CONTEXT_PROCESSORS setting includes/
''django.core.context_processors.auth''."
if not request.user.is_authenticated():
path = request.path_info.lstrip(''/'')
if not any(m.match(path) for m in EXEMPT_URLS):
return HttpResponseRedirect(settings.LOGIN_URL)
Luego projectname.middleware.LoginRequiredMiddleware
a mi MIDDLEWARE_CLASSES en settings.py.
Utiliza middleware.
http://www.djangobook.com/en/2.0/chapter17/ y http://docs.djangoproject.com/en/1.2/topics/http/middleware/#topics-http-middleware
Supongo que esto no cambió mucho en 1.2
Middleware le permite crear una clase con métodos que procesarán cada solicitud en diferentes momentos / condiciones, según lo defina.
por ejemplo, process_request (solicitud) se activaría antes de su vista, y puede forzar la autenticación y autorización en este punto.
Django Login Requiere Middleware
Pon este código en middleware.py:
from django.http import HttpResponseRedirect
from django.conf import settings
from django.utils.deprecation import MiddlewareMixin
from re import compile
EXEMPT_URLS = [compile(settings.LOGIN_URL.lstrip(''/''))]
if hasattr(settings, ''LOGIN_EXEMPT_URLS''):
EXEMPT_URLS += [compile(expr) for expr in settings.LOGIN_EXEMPT_URLS]
class LoginRequiredMiddleware(MiddlewareMixin):
def process_request(self, request):
assert hasattr(request, ''user'')
if not request.user.is_authenticated:
path = request.path_info.lstrip(''/'')
if not any(m.match(path) for m in EXEMPT_URLS):
return HttpResponseRedirect(settings.LOGIN_URL)
Y, en settings.py:
LOGIN_URL = ''/app_name/login''
LOGIN_EXEMPT_URLS=(
r''/app_name/login/'',
)
MIDDLEWARE_CLASSES = (
# ...
''python.path.to.LoginRequiredMiddleware'',
)
Así: ''app_name.middleware.LoginRequiredMiddleware''