Ich wollte eine grundlegende Authentifizierung vor dem Anmeldebildschirm der Administrationsseite von Django durchführen. Aber ich wollte nicht auf andere Seiten gehen. Ich weiß nicht viel über Python und Django, aber ich denke, ich könnte es vorerst tun, also werde ich es offenlegen. Ich denke nicht, dass es die beste Lösung ist, also lassen Sie mich bitte wissen, ob es einen besseren Weg gibt.
python: 3.5.2 Django==1.11.4
Es ist ein Gefühl, dass ich nicht sagen kann, dass das Ergebnis von Versuch und Irrtum für ungefähr zwei Tage super einfach ist.
yourproject/my_admin_site.py
from django.http import HttpResponse
from django.views.decorators.cache import never_cache
from django.contrib.admin.sites import site, AdminSite
import base64
class MyAdminSite(AdminSite):
def __init__(self, name='admin'):
super().__init__()
def get_urls(self):
self._registry = site._registry
return super().get_urls()
@never_cache
def login(self, request, extra_context=None):
if not self._basicAuth(request):
return self._http401()
return super().login(request, extra_context)
def _basicAuth(self, request):
if 'HTTP_AUTHORIZATION' not in request.META:
return False
(authscheme, base64_idpass) = request.META['HTTP_AUTHORIZATION'].split(' ', 1)
if authscheme.lower() != 'basic':
return _http401()
idpass = base64.decodestring(base64_idpass.strip().encode('ascii')).decode('ascii')
(id_, password) = idpass.split(':', 1)
if id_ == "foo" and password == "bar":
return True
else:
return False
def _http401(self):
response = HttpResponse("Unauthorized", status=401)
response['WWW-Authenticate'] = 'Basic realm="basic auth test"'
return response
my_site = MyAdminSite()
yourproject/urls.py
from django.conf.urls import url, include
from yourproject import my_admin_site
urlpatterns = [
#url(r'^admin/', admin.site.urls),
url(r'^admin/', my_admin_site.my_site.urls)
]
Es ist so.
yourproject/my_admin_site.py
def get_urls(self):
self._registry = site._registry
return super().get_urls()
Die Standardauthentifizierung kann ohne diesen Teil durchgeführt werden. Ohne diesen Teil wird jedoch ein trauriger Bildschirm angezeigt, der besagt, dass bei der Eingabe von admin kein Vorgang ausgeführt werden kann. Die Liste der Modelle, die bedient werden können, wird von außen im _register von django.contrib.admin.sites.site registriert. Wenn Sie also nur das Modell erben, können Sie diese Informationen anscheinend nicht abrufen. Es wird also gelöst, indem Sie django.contrib.admin.sites.site kopieren. \ _Registrieren Sie sich bei self. \ _ Registrieren Sie Ihre eigene Klasse. Ich habe Lust dazu. Ich mag es nicht, auf die implizite private Methode zuzugreifen, aber es hat funktioniert. Vielleicht. Im Moment gibt es keine Unannehmlichkeiten.
Ich finde es gut und schlecht, dass es keinen klaren Unterschied zwischen Python gibt, öffentlich und privat.
Referenz https://bitstar.jp/blog/basic%E8%AA%8D%E8%A8%BC
Recommended Posts