Um das Design der Autorisierungsseite im gleichen Stil wie das Design der gesamten Website zu gestalten, können Sie eine Designvorlage vorbereiten und die URL-Vorlage ändern, um uns die Seitendarstellung zu geben, die wir mit der erforderlichen Vorlage benötigen. Es kann auch nützlich sein, um die Funktionalität von Sperren zum Erraten von Passwörtern und eine intelligentere Umleitung des Benutzers zu den Seiten der Website nach der Autorisierung zu implementieren, je nachdem, ob der Benutzer den Status eines Mitarbeiters hat oder nicht.
Um mit der Benutzerautorisierung zu arbeiten, schlage ich vor, eine separate Anwendung / ein separates Modul zu verwenden, das Konten genannt wird.
Es ist nicht erforderlich, ein Autorisierungsformular zu schreiben, da Sie das Standardformular AuthenticationForm verwenden können, das in der Autorisierungsseitenvorlage verwendet werden muss.
Struktur des Kontenmoduls
accounts/ templates/ accounts/ login.html login_widget.html __init__.py admin.py apps.py models.py special_func.py urls.py views.py
Dieses Modul verwendet zwei Vorlagen:
- login.html ist die Vorlage für die Anmeldeseite
- login_widget.html ist eine Vorlage für ein Autorisierungs-Widget, das auf jeder Seite der Website platziert werden kann, sodass sich der Benutzer nicht nur von der Autorisierungsseite, sondern beispielsweise auch von jeder Seite mit einem Artikel anmelden kann .
Die Datei special_func.py enthält einige nützliche Funktionen, wie z. B. das Abrufen der vorherigen URL aus der Anfrage , um den Benutzer zurück auf die Seite zu leiten, wo der Benutzer hat sich angemeldet.
login_widget.html
Ich erinnere Sie daran, dass ich django_bootstrap3 auf der Website verwende, also wird die Vorlage es auch verwenden.
<form id="contact_form" action="{% url 'accounts:login' %}" method="post"> {% load bootstrap3 %} {% csrf_token %} {% bootstrap_form login_form %} {% buttons %} <div class="form-group"> <button type="submit" class="btn btn-primary">Войти</button> </div> {% endbuttons %} </form>
login.html
Dieses Widget wird der Autorisierungsvorlage hinzugefügt. Nach dem gleichen Prinzip können Sie ein Autorisierungs-Widget auf jeder beliebigen Seite der Website hinzufügen.
{% extends 'home/base.html' %} {% block content %} <div class="col-md-offset-3 col-md-6 voffset-60"> <h1>Войти на сайт</h1> {% include 'accounts/login_widget.html' %} </div> {% endblock %}
urls.py-Dateien
Um die Autorisierungsseite zu ersetzen und allgemein das Autorisierungs-Widget zu verwenden, müssen Sie die folgenden URL-Vorlagen in der Datei urls.py Ihres Projekts hinzufügen.
from django.conf.urls import url, include from django.contrib import admin from accounts.views import ELoginView # Представление для авторизации из модуля accounts # Чтобы перехватить страницу авторизации, необходимо # прописать путь к этой странице перед url админ-панели # и указать представление, которое будет теперь обрабатывать авторизацию urlpatterns = [ url(r'^admin/login/', ELoginView.as_view()), url(r'^admin/', admin.site.urls), url(r'^accounts/', include('accounts.urls')), # также добавим url модуля авторизаций ]
urls.py sieht die Kontomoduldatei so aus:
# -*- coding: utf-8 -*- from django.conf.urls import url from . import views app_name = 'accounts' urlpatterns = [ url(r'^login/$', views.ELoginView.as_view(), name='login'), ]
settings.py und apps.py
Vergessen Sie nicht, das Autorisierungsmodul in den Site-Einstellungen zu registrieren.
apps.py
from django.apps import AppConfig class AccountsConfig(AppConfig): name = 'accounts'
settings.py
INSTALLED_APPS = [ 'accounts.apps.AccountsConfig', ]
views.py
Und jetzt gehen wir zu der Ansicht über, die die Autorisierung behandelt, sowohl von der Autorisierungsseite als auch von jeder anderen Seite.
# -*- coding: utf-8 -*- from urllib.parse import urlparse from django.shortcuts import redirect, render_to_response from django.contrib import auth from django.template.context_processors import csrf from django.views import View from django.contrib.auth.forms import AuthenticationForm from .special_func import get_next_url class ELoginView(View): def get(self, request): # если пользователь авторизован, то делаем редирект на главную страницу if auth.get_user(request).is_authenticated: return redirect('/') else: # Иначе формируем контекст с формой авторизации и отдаём страницу # с этим контекстом. # работает, как для url - /admin/login/ так и для /accounts/login/ context = create_context_username_csrf(request) return render_to_response('accounts/login.html', context=context) def post(self, request): # получив запрос на авторизацию form = AuthenticationForm(request, data=request.POST) # проверяем правильность формы, что есть такой пользователь # и он ввёл правильный пароль if form.is_valid(): # в случае успеха авторизуем пользователя auth.login(request, form.get_user()) # получаем предыдущий url next = urlparse(get_next_url(request)).path # и если пользователь из числа персонала и заходил через url /admin/login/ # то перенаправляем пользователя в админ панель if next == '/admin/login/' and request.user.is_staff: return redirect('/admin/') # иначе делаем редирект на предыдущую страницу, # в случае с /accounts/login/ произойдёт ещё один редирект на главную страницу # в случае любого другого url, пользователь вернётся на данный url return redirect(next) # если данные не верны, то пользователь окажется на странице авторизации # и увидит сообщение об ошибке context = create_context_username_csrf(request) context['login_form'] = form return render_to_response('accounts/login.html', context=context) # вспомогательный метод для формирования контекста с csrf_token # и добавлением формы авторизации в этом контексте def create_context_username_csrf(request): context = {} context.update(csrf(request)) context['login_form'] = AuthenticationForm return context
Für Django empfehle ich Timeweb-Hoster VDS-Server .