usuario template permisos loginview facilito custom codigo basico django django-authentication login-required

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 en MIDDLEWARE no MIDDLEWARE_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.

https://github.com/mgrouchy/django-stronghold


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.



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''