Авторизация бетінің дизайнын бүкіл сайттың дизайнымен бірдей стильде жасау үшін дизайн үлгісін дайындап, url үлгісін бізге қажетті үлгімен қажетті бет көрінісін беру үшін өзгертуге болады. Сондай-ақ, ол құпия сөзді болжау құлыптарының функционалдығын іске асыру үшін және пайдаланушының қызметкер мәртебесі бар-жоғына байланысты авторизациядан кейін пайдаланушыны сайт беттеріне неғұрлым ақылды қайта бағыттау үшін пайдалы болуы мүмкін.
Пайдаланушы авторизациясымен жұмыс істеу үшін тіркелгілер деп аталатын бөлек қолданбаны/модульді пайдалануды ұсынамын.
Авторизация пішімін жазудың қажеті жоқ, өйткені сіз стандартты AuthenticationForm пішінін пайдалана аласыз, оны авторизация беті үлгісінде пайдалану қажет.
Есептер модулінің құрылымы
- accounts/
- templates/
- accounts/
- login.html
- login_widget.html
- __init__.py
- admin.py
- apps.py
- models.py
- special_func.py
- urls.py
- views.py
Бұл модуль екі үлгіні пайдаланады:
- login.html – кіру бетінің үлгісі
- login_widget.html авторизациялау виджетінің үлгісі, оны сайттың кез келген бетіне орналастыруға болады, осылайша пайдаланушы авторизация бетінен ғана емес, сонымен қатар мақаласы бар кез келген беттен де кіре алады, мысалы. .
special_func.py файлында пайдаланушыны қайта бағыттау үшін сұраудан алдыңғы URL мекенжайын алу сияқты кейбір пайдалы функциялар бар. пайдаланушы жүйеге кірді.
login_widget.html
Мен сайтта django_bootstrap3 қолданатынымды еске саламын, сондықтан үлгі де оны пайдаланады.
- <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
Бұл виджет авторизация үлгісіне қосылған. Сол принцип бойынша авторизация виджетін сайттың кез келген жеріндегі кез келген бетке қосуға болады.
- {% 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 файлдары
Авторизация бетін ауыстыру және жалпы авторизация виджетін пайдалану үшін жобаңыздың urls.py файлына келесі url үлгілерін қосу керек.
- 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 тіркелгілер модулінің файлы келесідей болады:
- # -*- 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 және apps.py
Сайт параметрлерінде авторизациялау модулін тіркеуді ұмытпаңыз.
apps.py
- from django.apps import AppConfig
- class AccountsConfig(AppConfig):
- name = 'accounts'
settings.py
- INSTALLED_APPS = [
- 'accounts.apps.AccountsConfig',
- ]
рет көру.py
Енді авторизация бетінен де, кез келген басқа беттен де авторизацияны өңдейтін көрініске көшейік.
- # -*- 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
Django үшін Timeweb хостының VDS-сервері ұсынамын.
Добрый вечер Евгений! Я сделал себе авторизацию аналогичную вашей, все работает, кроме возврата к предидущей странице. Редеректит всегда на главную, хотя в логах сервера вижу запросы на правильный редирект. При переходе по ссылке /test/, меня редиректит на страницу авторизации(как и должно происходить в моем случае), после авторизации меня втупую перебрасывает на главную а не на предидущую страницу.