Je voulais faire une authentification de base avant l'écran de connexion de la page d'administration de Django. Mais je ne voulais pas aller sur d'autres pages. Je ne connais pas grand chose à Python ni à Django, mais je pense que je pourrais le faire pour le moment, alors je vais l'exposer. Je ne pense pas que ce soit la meilleure solution, alors faites-moi savoir s'il existe une meilleure solution.
python: 3.5.2 Django==1.11.4
C'est un sentiment que je ne peux pas dire que le résultat d'essais et d'erreurs pendant environ deux jours est super simple.
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)
]
C'est comme ça.
yourproject/my_admin_site.py
def get_urls(self):
self._registry = site._registry
return super().get_urls()
L'authentification de base peut être effectuée sans cette partie, mais sans cela, un écran triste apparaît indiquant qu'aucune opération ne peut être effectuée lors de la saisie d'admin. La liste des modèles qui peuvent être exploités est enregistrée de l'extérieur dans _register de django.contrib.admin.sites.site, il semble donc que vous ne pouvez pas extraire ces informations si vous héritez simplement du modèle? Donc, il est résolu en copiant django.contrib.admin.sites.site. \ _Register to self. \ _ Register de votre propre classe. J'ai envie de le faire. Je n'aime pas accéder à la méthode privée implicite, mais cela a fonctionné. Peut-être. Il n'y a aucun inconvénient pour le moment.
Je pense qu'il est bon et mauvais qu'il n'y ait pas de différence claire entre python, public et privé.
Référence https://bitstar.jp/blog/basic%E8%AA%8D%E8%A8%BC