Модуль аутентификации django поможет вам реализовать полную пользовательскую систему | Месяц темы Python

задняя часть Python

Эта статья участвует в "Месяце тем Python", подробнее см.Ссылка на мероприятие

Поиск по общедоступным номерам Wechat [Программа Юань Сяочжуан], Ленивый человек не может наслаждаться отдыхом~

предисловие

При разработке веб-сайта неизбежно реализовать пользовательскую систему веб-сайта, включая регистрацию пользователя, вход пользователя в систему, аутентификацию пользователя, выход пользователя из системы и т. д. Писать самостоятельно очень проблематично. Django, как окончательная структура для перфекционист, должен также Принимая во внимание эти проблемы, django решает эти проблемы с помощью мощной встроенной системы аутентификации пользователей -auth.Эта статья подробно расскажет о функции аутентификации django.

Знакомство с модулем авторизации

Django предоставляет очень полезный компонент, который в основном отвечает за полный набор функций аутентификации пользователя при входе в систему, то есть компонент auth. С компонентом аутентификации нам не нужно вручную писать декоратор проверки входа, и нам не нужно вручную устанавливать сеанс для сохранения состояния пользователя. После того, как проект django выполнит команду миграции базы данных, он сгенерирует набор таблиц по умолчанию, включая таблицу auth_user, компонент аутентификации тесно связан с этой таблицей. Кроме того, проект django по умолчанию будет иметь систему управления фоном администратора, а информация о вошедшем в систему пользователе хранится в таблице auth_user; а пользователи делятся на обычных пользователей и суперпользователей, только суперпользователи могут войти в админку система управления фоном.

python manage.py createsuperuser
# 邮箱可以不写,密码长度最短8位,创建完成之后就可以登录django后台管理了。

Основное использование модуля аутентификации

Проверка входа:auth.authenticate()

from django.contrib import auth

user_obj = auth.authenticate(request,
                             username=username,
                             password=password)

print(user_obj) 
print(user_obj.username)

# 注意点:
    1.authenticate()括号内必须同时传入用户名和密码
    2.密码自动加密校验
    3.校验成功,返回当前对象,校验失败返回None

Сохранить состояние пользователя:auth.login()

auth.login(request, user_obj)  
request.user  # 获取当前登录的用户对象
# 注意点:
    1.该方法需要request、和当前登陆用户对象俩个方法
    2.该方法自动设置session,类似于request.session[key] = user_obj
    3.只要执行了该方法后,就可以在任何地方通过request.user获取到当前登陆的用户对象

Войти декоратор: судейство, вошел ли пользователь в системе

from django.contrib.auth.decorators import login_required


@login_required(login_url='/login/') 
def index(request):
    pass

# 注意点:
    1.未登录时跳转到的页面需要手动设置;设置分局部设置和全局设置。
    2.局部设置,直接在装饰器内通过参数login_url指定
    3.全局设置,在配置文件中通过参数LOGIN_URL = '/login/'设置
    4.装饰器帮我们在跳转后的url后面添加了target_url,我们在login的视图函数中手动捕获它
    4.局部设置的优先级高与全局的设置
    5.全局的好处在于无需重复写代码 但是跳转的页面却很单一
    6.局部的好处在于不同的视图函数在用户没有登陆的情况下可以跳转到不同的页面

Как изменить проверку пароля пользователя

- 如何进行原密码的比对
request.user.check_password(old_password)
- 修改用户信息
request.user.set_password(new_password)  # 仅仅是在修改对象的属性
request.user.save()  # 这一步才是真正的操作数据库

Как выйти из текущего пользователя:auth.logout(request)

Как пользователи регистрируются

# 方式1:操作auth_user表写入数据(不推荐,密码没有加密处理)
from django.contrib.auth.models import User
User.objects.create(username=username, password=password) 


# 方式2:创建普通用户
User.objects.create_user(username=username, password=password)


# 方式3:创建超级用户
User.objects.create_superuser(username=username,
                              email='123@qq.com',
                              password=password)

#注意:
	1.方式2和方式3创建成功后返回当前对象
	2.使用代码创建超级用户,邮箱是必填的,而用命令创建则可以不填

Расширенная таблица auth_user

Встроенная система аутентификации настолько проста в использовании, но все поля таблицы auth_user фиксированы, и я не могу использовать их напрямую в проекте!

Например, я хочу добавить поле для хранения номера мобильного телефона пользователя, что мне делать?

Если вы умны, вы можете подумать о создании другой таблицы, а затем связать ее со встроенной таблицей auth_user один к одному.Хотя это может удовлетворить требования, есть ли лучший способ реализовать это? Ответ, конечно.

Мы можем определить наш собственный класс Model, унаследовав встроенный класс AbstractUser. Таким образом, пользовательская таблица может быть гибко спроектирована в соответствии с требованиями проекта, и может использоваться мощная система аутентификации Django.

from django.contrib.auth.models import AbstractUser

class UserInfo(AbstractUser):
    nid = models.AutoField(primary_key=True)
    phone = models.CharField(max_length=11, null=True, unique=True)
    
    def __str__(self):
        return self.username

Если унаследованоAbstractUserclass, то при выполнении команды миграции базы данныхauth_userТаблица не будет создана снова, иUserInfoпоявится в таблицеauth_userВсе поля плюс их собственные расширенные поля, преимущество этого заключается в том, что вы можете напрямую щелкнуть по своей таблице, чтобы быстрее завершить операцию и расширение.

Однако предпосылки для использования этого метода следующие:

1. Команда переноса базы данных не выполнялась до наследования
auth_userОна не была создана, если текущая библиотека была создана, вы можете изменить новую библиотеку
2. Не перезаписывать в унаследованных классахAbstractUserимя поля внутри
Не перемещайте некоторые поля в таблице, просто расширьте лишние поля
3. Вам нужно указать django в файле конфигурации, что вы хотите использоватьUserInfoальтернативаauth_user
AUTH_USER_MODEL = 'app01.UserInfo' # '应用名.表名'
4. Если вместо этого вы напишете собственную таблицуauth_userТогда функция модуля авторизации по-прежнему используется как обычно, а страница справочной таблицы — из оригинала.auth_userсталUserInfo

Эпилог

Статья была впервые опубликована в публичном аккаунте WeChat.Ченг Юань Сяочжуан, синхронизировано сНаггетс.

Кодировать слова непросто, объясните, пожалуйста, источник перепечатки, а маленькие друзья, которые проходят мимо, протягивают свои милые пальчики и ставят лайк перед уходом (╹▽╹)

image.png