ログイン用に独自のビューを作成しました。ただし、ユーザーが/ adminに直接アクセスすると、管理者ログインページが表示され、カスタムビューは使用されません。/admin以外のすべてに使用されるログインビューにリダイレクトするにはどうすればよいですか?
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
にリダイレクトされます。
上記の答えは、「次の」クエリパラメータを正しく尊重していないことがわかりました。
この問題を解決する簡単な方法は、単純なリダイレクトを使用することです。サイトのURLファイルで、すぐにbefore admin urlを含めて、次のような行を入力します。
url(r'^admin/login$', RedirectView.as_view(pattern_name='my_login_page', permanent=True, query_string=True))
@Isaacのソリューションは、悪意のあるボットの大部分を拒否するはずですが、プロの侵入を保護するものではありません。ログインしたユーザーがadminにログインしようとすると、次のメッセージが表示されます。
代わりに、管理デコレータを使用して、非特権ユーザーをすべて拒否する必要があります。
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で 追加 でした。
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は素晴らしいです。
ホラ
非常に簡単な解決策を見つけました。
Django管理者ログインのURLは、独自のログインビューで処理されることを伝えてください
プロジェクトのurls.pyファイルを変更する必要があります(アプリケーションのものではなく注意してください)
from your_app_name import views
_url(r'^admin/', include(admin.site.urls))
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)),
]
_
私は同じ問題を抱えていて、受け入れられた 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を取得するという考え方です。それ以外の場合は、通常のログインページに移動します(既にログインしている場合を除く)。
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)),
これは私の解決策です カスタム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
管理者ログイン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),
]