Как я могу не использовать вид входа в систему администратора Django? - PullRequest
21 голосов
/ 21 июля 2011

Я создал свой собственный вид для входа в систему.Однако, если пользователь заходит непосредственно в / admin, он переносит его на страницу входа администратора и не использует мой пользовательский вид.Как я могу сделать так, чтобы он перенаправлялся в окно входа в систему, используемое для всего, кроме / admin?

Ответы [ 9 ]

51 голосов
/ 02 ноября 2012

С http://djangosnippets.org/snippets/2127/—wrap Страница входа администратора с login_required. Например, в 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)

Возможно, у вас уже есть две средние строки и, возможно, даже первая строка; добавление этой четвертой строки приведет к тому, что все, что попадет в функцию admin.site.login, будет перенаправлено на ваш LOGIN_URL с соответствующим параметром next.

8 голосов
/ 05 мая 2015

Я обнаружил, что ответ выше не учитывает параметр запроса "next" правильно.

Простой способ решить эту проблему - использовать простое перенаправление. В файле URL вашего сайта сразу до , включая URL-адреса администратора, добавьте строку, подобную этой:

   url(r'^admin/login$', RedirectView.as_view(pattern_name='my_login_page', permanent=True, query_string=True))
4 голосов
/ 26 июля 2017

Хотя решение @ Isaac должно отклонять большинство вредоносных ботов, оно не обеспечивает защиту для профессионального проникновения. При входе в систему пользователь получает следующее сообщение при попытке авторизации администратора:

Django re-login prompt

Вместо этого мы должны использовать администратор-декоратор, чтобы отклонить всех непривилегированных пользователей:

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

Насколько мне известно, декоратор был добавлен в 1,9.

4 голосов
/ 12 сентября 2015

Hola
Я нашел очень простое решение.
Просто скажите django, что URL для входа в систему администратора обрабатывается вашим собственным видом входа в систему

Вам просто нужно изменить urls.py fle проекта (заметьте, не приложение)

  1. В папке PROJECT найдите файл urls.py.
  2. Добавить эту строку в раздел импорта
    from your_app_name import views
  3. Найдите эту строку
    url(r'^admin/', include(admin.site.urls))
  4. Добавьте над этой строкой следующий
    url(r'^admin/login/', views.your_login_view),

Это пример

    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)),
    ]
3 голосов
/ 13 сентября 2011

http://blog.montylounge.com/2009/07/5/customizing-django-admin-branding/ ( веб-архив)

Я пытаюсь решить именно эту проблему, и я нашел решение в этом блоге парней.В основном, переопределите шаблон администратора и используйте свой собственный шаблон.Короче говоря, просто создайте файл с именем login.html в / path-to-project / templates / admin /, и он заменит страницу входа администратора.Вы можете скопировать оригинал (django / contrib / admin / templates / login.html) и изменить одну или две строки.Если вы хотите полностью удалить страницу входа по умолчанию, вы можете сделать что-то вроде этого:

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

Вот оно.Одна строка в одном файле.Джанго потрясающий.

2 голосов
/ 22 июля 2016

У меня возникла та же проблема, я пытался использовать принятый ответ , но проблема та же, что указана в комментарии выше . Тогда я сделал что-то немного другое, вставив сюда, если это кому-нибудь пригодится.

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)

Идея состоит в том, что если пользователь входит в систему и пытается получить доступ к администратору, он получает 404. В противном случае он приведет вас к обычной странице входа (если вы уже не вошли в систему)

2 голосов
/ 21 июля 2011

В вашем файле ROOT_URLCONF (по умолчанию это urls.py в корневой папке проекта), есть такая строка:

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

Если это так, вы можете заменить include (admin.site.urls) созданным вами пользовательским представлением:

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

или если ваше приложение имеет собственный urls.py, вы можете включить его следующим образом:

(r'^admin/', include(myapp.urls)),
1 голос
/ 06 мая 2015

Это мое решение с пользовательским классом AdminSite :

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
0 голосов
/ 03 октября 2018

Вы можете перенаправить URL-адрес входа администратора в представление авторизации:

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),
]
...