web-dev-qa-db-ja.com

Djangoの管理者ログインビューを使用できないのはどうしてですか?

ログイン用に独自のビューを作成しました。ただし、ユーザーが/ adminに直接アクセスすると、管理者ログインページが表示され、カスタムビューは使用されません。/admin以外のすべてに使用されるログインビューにリダイレクトするにはどうすればよいですか?

24
Bufke

From http://djangosnippets.org/snippets/2127/ —管理者ログインページを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)

あなたはおそらくすでに真ん中の2行、そしておそらく最初の行を持っています。その4行目を追加すると、admin.site.login関数にヒットしたものはすべて、適切なnextパラメーターを使用してLOGIN_URLにリダイレクトされます。

55
Isaac

上記の答えは、「次の」クエリパラメータを正しく尊重していないことがわかりました。

この問題を解決する簡単な方法は、単純なリダイレクトを使用することです。サイトのURLファイルで、すぐにbefore admin urlを含めて、次のような行を入力します。

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

@Isaacのソリューションは、悪意のあるボットの大部分を拒否するはずですが、プロの侵入を保護するものではありません。ログインしたユーザーがadminにログインしようとすると、次のメッセージが表示されます。

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, login_url=settings.LOGIN_URL)

私の知る限り、デコレータは1.9で 追加 でした。

7
Tatsuyuki Ishi

http://blog.montylounge.com/2009/07/5/customizing-Django-admin-branding/ウェブアーカイブ)

私はこの問題を正確に解決しようとしていますが、この人のブログで解決策を見つけました。基本的に、adminテンプレートをオーバーライドし、独自のテンプレートを使用します。つまり、/ path-to-project/templates/admin /にlogin.htmlというファイルを作成するだけで、管理者のログインページが置き換えられます。オリジナル(Django/contrib/admin/templates/login.html)をコピーして、1行か2行を変更できます。デフォルトのログインページを完全に廃棄したい場合は、次のようにすることができます。

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

そこにそれがある。 1つのファイルに1行。 Djangoは素晴らしいです。

3
chriscauley

ホラ
非常に簡単な解決策を見つけました。
Django管理者ログインのURLは、独自のログインビューで処理されることを伝えてください

プロジェクトのurls.pyファイルを変更する必要があります(アプリケーションのものではなく注意してください)

  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
ePi272314

私は同じ問題を抱えていて、受け入れられた answer を使おうとしましたが、 上記のコメント で指摘されたのと同じ問題があります。それから私は少し違うことをしました、これが誰かに役立つならここに貼り付けます。

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
eran

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)),
2
sandinmyjoints

これは私の解決策です カスタム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
1
sirex

管理者ログイン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),
]
0
Zxcv