with tutorial latest framework español desde con cero applications django django-admin django-authentication

tutorial - ¿Cómo no puedo usar la vista de inicio de sesión del administrador de Django?



tutorial django (9)

En su archivo ROOT_URLCONF (de manera predeterminada, es urls.py en la carpeta raíz del proyecto), hay una línea como esta:

urlpatterns = patterns('''', ... (r''^admin/'', include(admin.site.urls)), ... )

Si es así, querría reemplazar include (admin.site.urls) con la vista personalizada que creó:

(r''^admin/'', ''myapp.views.myloginview''),

o si tu aplicación tiene su propia urls.py, puedes incluirla así:

(r''^admin/'', include(myapp.urls)),

He creado mi propia vista para iniciar sesión. Sin embargo, si un usuario va directamente a / admin, lo lleva a la página de inicio de sesión del administrador y no usa mi vista personalizada. ¿Cómo puedo hacer que se redirija a la vista de inicio de sesión utilizada para todo no para / admin?


Encontré que la respuesta anterior no respeta correctamente el "siguiente" parámetro de consulta.

Una forma fácil de resolver este problema es usar un redireccionamiento simple. En el archivo de URL de su sitio, inmediatamente antes de incluir las URL de administrador, ponga una línea como esta:

url(r''^admin/login$'', RedirectView.as_view(pattern_name=''my_login_page'', permanent=True, query_string=True))


Esta es mi solución con la clase AdminSite personalizada :

class AdminSite(admin.AdminSite): def _is_login_redirect(self, response): if isinstance(response, HttpResponseRedirect): login_url = reverse(''admin:login'', current_app=self.name) response_url = urllib.parse.urlparse(response.url).path return login_url == response_url else: return False def admin_view(self, view, cacheable=False): inner = super().admin_view(view, cacheable) def wrapper(request, *args, **kwargs): response = inner(request, *args, **kwargs) if self._is_login_redirect(response): if request.user.is_authenticated(): return HttpResponseRedirect(settings.LOGIN_REDIRECT_URL) else: return redirect_to_login(request.get_full_path(), reverse(''accounts_login'')) else: return response return wrapper


Hola
He encontrado una solución muy simple.
Simplemente dile a Django que la url para el inicio de sesión del administrador es manejada por tu propia vista de inicio de sesión

Solo necesita modificar el archivo urls.py del proyecto (tenga en cuenta, no la aplicación)

  1. En su carpeta de PROYECTOS localice el archivo urls.py.
  2. Añadir esta línea a la sección de importaciones.
    from your_app_name import views
  3. Localiza esta linea
    url(r''^admin/'', include(admin.site.urls))
  4. Agregue sobre esa línea lo siguiente
    url(r''^admin/login/'', views.your_login_view),

Esto es un ejemplo

from django.conf.urls import include, url from django.contrib import admin from your_app import views urlpatterns = [ url(r''^your_app_start/'', include(''your_app.urls'',namespace="your_app_name")), url(r''^admin/login/'', views.your_app_login), url(r''^admin/'', include(admin.site.urls)), ]


Puede redireccionar la URL de inicio de sesión del administrador a la vista de inicio de sesión de autenticación:

from django.contrib import admin from django.urls import path, include urlpatterns = [ path('''', include(''your_app.urls'')), path(''accounts/'', include(''django.contrib.auth.urls'')), path(''admin/login/'', RedirectView.as_view(url=''/accounts/login/?next=/admin/'', permanent=True)), path(''admin/'', admin.site.urls), ]


Si bien la solución de @ Isaac debería rechazar la mayoría de los bots maliciosos, no proporciona protección para la penetración profesional. Cuando un usuario registrado recibe el siguiente mensaje cuando intenta iniciar sesión en admin:

En su lugar, deberíamos utilizar el decorador de administración para rechazar a todos los usuarios sin privilegios:

from django.contrib.admin.views.decorators import staff_member_required from django.contrib import admin [ ... ] admin.site.login = staff_member_required(admin.site.login)

Que yo sepa, el decorador se added en 1.9.


Tuve el mismo problema, intenté usar la answer aceptada, pero tiene el mismo problema que se señaló en el comentario anterior . Luego hice algo diferente, pegar aquí si esto fuera útil para alguien.

def staff_or_404(u): if u.is_active: if u.is_staff: return True raise Http404() return False admin.site.login = user_passes_test( staff_or_404, )(admin.site.login)

La idea es que si el usuario inicia sesión e intentó acceder al administrador, obtiene 404. De lo contrario, lo forzará a la página de inicio de sesión normal (a menos que ya haya iniciado sesión)


http://blog.montylounge.com/2009/07/5/customizing-django-admin-branding/ ( archivo web)

Estoy tratando de resolver exactamente este problema y encontré la solución en este blog de chicos. Básicamente, anule la plantilla de administrador y use su propia plantilla. En resumen, simplemente cree un archivo llamado login.html en / path-to-project / templates / admin / y reemplazará la página de inicio de sesión del administrador. Puede copiar el original (django / contrib / admin / templates / login.html) y modificar una o dos líneas. Si desea eliminar por completo la página de inicio de sesión predeterminada, puede hacer algo como esto:

{% extends "my-login-page.html" %}

Ahí está. Una línea en un archivo. Django es increíble.


Desde http://djangosnippets.org/snippets/2127/ envuelva la página de inicio de sesión del administrador con login_required . Por ejemplo, en urls.py :

from django.contrib.auth.decorators import login_required from django.contrib import admin admin.autodiscover() admin.site.login = login_required(admin.site.login)

Probablemente ya tenga las dos líneas medias y tal vez incluso la primera línea; agregar esa cuarta línea causará que cualquier cosa que haya golpeado la función admin.site.login redirija a tu LOGIN_URL con el next parámetro apropiado.