Рубрики
Без рубрики

Как обрабатывать аутентификацию пользователя в Python Django

Автор оригинала: FreeCodeCapm Team.

от Мухаммеда Субхана Хан

В этом руководстве я покажу, как выполнить вход пользователя, выйти и регистрацию в Django. Весь код, который я опишу здесь, есть в этом github Репозиторий Отказ Этот учебник будет использовать Python 2.7 и Django 1.9.

Установка и структура проекта

Чтобы начать, запустите следующие команды с терминала:

django-admin startproject src
cd src
python manage.py startapp mysite
python manage.py migrate

В двух словах, эти четыре команды создают новый проект Django с именем SRC, введите проект, создайте новое приложение, MySite, внутри проекта SRC, затем создайте базу данных SQLite для проекта с именем DB.SQLite3. Также обязательно включите приложение MySite внутри SRC/Settings.py.

INSTALLED_APPS = [
    'src',
    'django.contrib.admin',
    'django.contrib.auth',
    ...
]

Создайте каталог с именованными шаблонами внутри приложения Mysite. Затем создайте два других каталога внутри MySite/Templates по имени «Регистрация» и «MySite».

Кроме того, я буду ссылаться на шаблоны, хранящиеся в этих двух каталогах, используя регистрацию/{template_name} и mysite/{template_name}.

Ваша структура проекта должна в конечном итоге выглядеть так:

.
|-- db.sqlite3
|-- manage.py
|-- mysite
|   |-- admin.py
|   |-- apps.py
|   |-- __init__.py
|   |-- migrations
|   |   `-- __init__.py
|   |-- models.py
|   |-- templates
|   |   |-- mysite
|   |   `-- registration
|   |-- tests.py
|   `-- views.py
`-- src
    |-- __init__.py
    |-- settings.py
    |-- urls.py
    `-- wsgi.py

Вы уже можете выяснить, что могут быть использованы шаблоны в MySite (просмотры, определенные в MySite, например). Мы доберемся до важности регистрации в ближайшее время.

Также нам понадобятся пользователи для проверки нашего сайта. Вы можете сделать это, создавая суперпользователь ( Python Manage.py CreatesuperUser ). Но не волнуйтесь – все, что описывает это учебное пособие, может быть применено к нормальным пользователям, без каких-либо изменений. Вы можете создавать нормальные пользователи с целью этого урока, создав суперпользователь, запустив свой сервер разработки ( Python Manage.py Runserver ), навигации к localhost: 8000/admin, навигации к пользователям, затем создание нового пользователя.

Обработка входа в систему

Согласно документации, Django предоставляет Виды Для обработки методов аутентификации пользователя, таких как вход в систему, выходы и восстановление пароля. Это экономит нам неприятности, чтобы пройти определение наших собственных взглядов на обработку этих вещей. Кроме того, эти взгляды довольно настраиваются и включены в Django.contrib.auth.views, которые мы импомнем следующим образом:

from django.contrib.auth import views as auth_views

Мы хотим открывать страницу входа в систему, когда пользователь переходит/войти. Использовать Вход Просмотр добавить следующее в SRC/URLS.PY

url(r'^login/$', auth_views.login),

Вид по умолчанию отображает шаблон, который находится в регистрации/вхождении .HTML.

Наша регистрация/login.html включает в себя следующую простую HTML-форму:






    Login

    

    
{% csrf_token %}

Не хотите использовать регистрацию/login.html? Вы можете указать, какие шаблоны использовать, предоставив словарь Python в качестве третьего параметра в URLPattern, с «Template_Name» в качестве ключа и расположение шаблона в качестве значения. Если вы хотите использовать MySite/login_user.html в качестве шаблона:

url(r'^login/$', auth_views.login, {'template_name': 'mysite/login_user.html'})

Кроме того, вы также можете использовать другие аргументы вида, в значительной степени так же. Для полного списка аргументов, обратитесь к Документы Отказ

Когда пользователь нажимает на кнопку «Отправить», Вход в систему обрабатывает для нас вход. После того, как пользователь вошел в систему, мы можем определить, где на странице необходимо перенаправить, указав login_redirect_url в src/settings.py. По умолчанию мы будем перенаправлены на/войти, если логин не удается.

LOGIN_REDIRECT_URL = '/'

Теперь запустите сервер разработки ( Python Manage.py Runserver ) и перейдите к localhost: 8000/login/. Введите учетные данные пользователя для вашего примера суперпользователя. Вы будете перенаправлены на/если вход был успешным. В противном случае вы будете перенаправлены на/логин.

Даже если ваш логин был успешным, вы будете перенаправлены в/и увидеть ошибку. Это произойдет, потому что мы не определили URLPattern для этого.

Обработка выхода из системы

Далее мы хотим, чтобы пользователи выходили в систему, когда они перемещаются на/выйти. Мы можем продлить ту же аналогию в качестве входа в систему для выхода, доступ к представлению, соответствующему Выход из системы Применяя следующую URLPattern в SRC/settings.py

url(r'^logout/$', auth_views.logout)

View Logout отображает шаблон регистрации/регистрации_out.html по умолчанию. Вот простой шаблон выхода из системы:




    

    

    

    You have successfully logged out.
    Home

    

Как и в случае входа в систему, вы можете изменить местоположение шаблона, включая объект с ключом «Template_Name» и местоположением шаблона в качестве значения.

Зарегистрироваться

Мы хотим, чтобы наши пользователи регистрируем на нашем веб-сайте, навигацию на/регистрируйте. Прежде чем делать это, давайте немного очистим проект. Прежде всего, мы хотим URLPattern Для нашей домашней страницы/. Мы собираемся использовать приложение Mysite для этой цели, поэтому добавьте следующее в SRC/URLS.PY

url(r'^', include('mysite.urls'))

Теперь нам нужно включить URLPattern для/в mysite/urls.py, поэтому включите следующее URLPattern В нем (после импорта соответствующих библиотек)

from django.conf.urls import url, include
from django.contrib import admin
from .views import home, register

urlpatterns = [
    url(r'^$', home),
    url(r'^register/', register),
]

Здесь Главная относится к представлению для/и Регистрация Относится к представлению для обработки регистрации. Для создания формы регистрации пользователя мы будем использовать встроенные формы Django. Для этого создайте файл mysite/forms.py и включите следующее:

from django import forms

class UserRegistrationForm(forms.Form):
    username = forms.CharField(
        required = True,
        label = 'Username',
        max_length = 32
    )
    email = forms.CharField(
        required = True,
        label = 'Email',
        max_length = 32,
    )
    password = forms.CharField(
        required = True,
        label = 'Password',
        max_length = 32,
        widget = forms.PasswordInput()
    )

Во-первых, мы импортируем библиотеку форм, мы создаем UserregistrationForm , который наследует от Формас.form Отказ Мы хотим, чтобы наши формы были 3 поля: Имя пользователя , Email , пароль и переменные задания делают только что. Формасс.charfield представляет собой поле, состоящее из символов. Аргументы – Требуется , max_length и этикетка – Укажите, требуется ли поле, это максимальная длина, а метка поля. Параметр виджета в пароль говорит, что пароль это вход типа «пароль».

Мы хотим, чтобы пользователи могли просматривать форму, если они переходят на/регистрируют, а также заполните его и отправить ее. Они соответствуют получению и размещению запросов/регистрируются. Таким образом, мы включаем следующее в MySite/Views.py:

from django.shortcuts import render
from django.contrib.auth.models import User
from django.contrib.auth import authenticate, login
from django.http import HttpResponseRedirect
from django import forms
from .forms import UserRegistrationForm

# Create your views here.

def home(request):
    return render(request, 'mysite/home.html')
    
def register(request):
    if request.method == 'POST':
        form = UserRegistrationForm(request.POST)
        if form.is_valid():
            userObj = form.cleaned_data
            username = userObj['username']
            email =  userObj['email']
            password =  userObj['password']
            if not (User.objects.filter(username=username).exists() or User.objects.filter(email=email).exists()):
                User.objects.create_user(username, email, password)
                user = authenticate(username = username, password = password)
                login(request, user)
                return HttpResponseRedirect('/')    
            else:
                raise forms.ValidationError('Looks like a username with that email or password already exists')
                
    else:
        form = UserRegistrationForm()
        
    return render(request, 'mysite/register.html', {'form' : form})

Представление дома определяется для рендеринга шаблона SRC/Home.html, что выглядит следующим образом:




    

    Home

    

    {% if user.is_authenticated %}
    

hello

welcome {{ user.username }}

Logout

{% else %}

Login

Register

{% endif %}

Мы проверяем, вошел ли пользователь, используя User.is_authententicate и отобразить наш приветственный текст вместе с именем пользователя (используя user.username ) вместе со ссылкой на вынос. Если нет, мы будем отображать ссылки для входа в систему и регистрацию.

Для представления реестра мы проверяем, является ли метод запроса пост или нет. Если это не так, то указываем форму, чтобы быть UserregistrationForm И визуализируйте, это, передавая его в качестве параметра в MySite/Register.html шаблон:




    

    

    

    
{% csrf_token %} {{ form.as_p }}

Форма, которая передается в качестве ввода к представлению регистра, затем отображается с использованием form.as_p Отказ Когда пользователь нажимает кнопку отправки, отправляется запрос на запись. Мы принимаем данные формы, используя переменную формы.

Затем мы проверяем, действителен ли данные формы (через IS_Valid () ). Если это так, мы создаем userobj словарь, который мы получаем, применяя Cleaned_data к форме и извлечению Имя пользователя , Email и пароль от него.

В нашей базе данных существует условие. Если это так, мы создаем новый пользователь, войти в систему, используя тот же пользователь и перенаправить на/. В противном случае мы поднимаем ошибку, сказав, что такой пользователь уже существует.

Вот некоторые соответствующие документации на случай, если вы застряли, или хотите узнать больше:

Если вы хотите дать мне отзыв об этом руководстве, Свяжитесь со мной Отказ

Если вам понравилось этот пост, пожалуйста, ♡ это и поделиться этим:)