博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Django 用户身份验证
阅读量:4550 次
发布时间:2019-06-08

本文共 4459 字,大约阅读时间需要 14 分钟。

Django 内置 User 模型(django.contrib.auth.models.User),它继承自 AbstractUser 类。User 模型包含的字段有:

  • username
  • password
  • email
  • first_name
  • last_name
  • is_active
  • is_staff
  • is_superuser
  • date_joined

其中,username 和 password 是必需的,其他字段是可选的。

创建应用

在 mysite 项目中新建一个应用 users:

$ python manage.py startapp users

模型设计

如果我们想存储与 User 模型关联的信息,可以使用 OneToOneField 到包含其他信息字段的模型。这种模型经常被称作 Profile 模型,因为它可能存储站点用户的非身份验证的相关信息。编辑 users/models.py 文件:

from django.db import modelsfrom django.contrib.auth.models import Userclass UserProfile(models.Model):    user = models.OneToOneField(User, on_delete=models.CASCADE)    phone = models.CharField(max_length=20, blank=True)    def __str__(self):        return self.phone    class Meta:        verbose_name = '用户'        verbose_name_plural = '用户'

数据库设置

数据库我们选择系统默认的 Sqlite,不用修改 mysite/settings.py 配置:

DATABASES = {    'default': {        'ENGINE': 'django.db.backends.sqlite3',        'NAME': os.path.join(BASE_DIR, 'db.sqlite3'),    }}

然后在终端输入以下命令,来创建 UserProfile 的数据表。

$ python manage.py makemigrations $ python manage.py migrate

注册APP

在 mysite/settings.py 配置项 INSTALLED_APPS 中添加应用:

INSTALLED_APPS = [    'django.contrib.admin',    'django.contrib.auth',    'django.contrib.contenttypes',    'django.contrib.sessions',    'django.contrib.messages',    'django.contrib.staticfiles',    'users.apps.UsersConfig',   ]

表单

让用户通过表单提交数据,并处理这些数据。我们新建一个 users/forms.py 文件,然后创建 form 。代码如下:

from django import formsfrom django.contrib.auth.models import User class LoginForm(forms.Form):    username = forms.CharField(label='用户名', max_length=30)    password = forms.CharField(label='密码', widget=forms.PasswordInput)

1. 注册视图

1 from django.shortcuts import render, redirect 2 from django.contrib import auth 3 from django.contrib.auth.forms import UserCreationForm 4 from django.contrib.auth.models import User 5 from users.models import UserProfile 6  7 def register(request): 8     if request.method == "POST": 9         register_form = UserCreationForm(request.POST)    # UserCreationForm 创建用户表单10         if register_form.is_valid():11             username = register_form.cleaned_data['username']12             password = register_form.cleaned_data['password1']13             password_confirm = register_form.cleaned_data['password2']14             user_name = User.objects.filter(username=username)15             if len(user_name) == 0:16                 if password == password_confirm:17                     user = User.objects.create_user(username=username, password=password)18                     UserProfile.objects.create(user_id=user.id)19                     auth.login(request, user)20                     return redirect('/users/login/')21                 else:22                     return render(request, 'users/register.html', locals())23     else:24         register_form = UserCreationForm()25     return render(request, 'users/register.html', {
'register_form': register_form})

2. 登录视图

1 from django.shortcuts import render, redirect 2 from django.contrib import auth, messages 3 from users.forms import LoginForm 4 from django.contrib.auth.models import User 5  6 def login(request): 7     if request.method == "POST": 8         login_form = LoginForm(request.POST) 9         if login_form.is_valid():10             username = login_form.cleaned_data['username']11             password = login_form.cleaned_data['password']12             user = auth.authenticate(username=username, password=password)  # 后端验证用户名和密码13             if user and user.is_active:14                 auth.login(request, user)   # 将用户数据保存在 session 中,即实现了登录动作15                 messages.success(request, '登录成功')16                 return redirect('/users/index/')17             else:18                 messages.error(request, '用户名或密码错误')19                 return render(request, 'users/login.html', locals())20     else:21         login_form = LoginForm()22     return render(request, 'users/login.html', {
'login_form': login_form})

3. index 和 logout 视图

def logout(request):    auth.logout(request)  # 调用 logout() 后,当前请求的会话数据会被全部清除    return redirect('/users/login/')def index(request):    return render(request, 'users/index.html')

URL路由

from django.urls import pathfrom . import viewsapp_name = 'users'urlpatterns = [    path('index/', views.index, name='index'),    path('login/', views.login, name='login'),    path('register/', views.register, name='register'),    path('logout/', views.logout, name='logout'),]

 

转载于:https://www.cnblogs.com/yutb/p/10656346.html

你可能感兴趣的文章
接口和抽象类的对比,面向对象的三大特性和四大特性
查看>>
1-9 RHEL7-文件权限管理
查看>>
apache服务器安装
查看>>
Search a 2D Matrix
查看>>
文件解析漏洞
查看>>
弹性成像的一些术语
查看>>
ListBox 消息 (zz)
查看>>
计算机网络之万维网WWW
查看>>
作业2
查看>>
vim 笔记
查看>>
MySQL的基本使用命令
查看>>
第三次作业
查看>>
蓝桥杯-猜算式
查看>>
PHP定界符<<<EOF
查看>>
05_模板方法模式
查看>>
linux下搭建DHCP服务
查看>>
双曲函数与反双曲函数
查看>>
EF中的Select * From T Where id In(xxx,xxx)子查询
查看>>
自己写的一个校验IP、IP掩码、IP段的方法
查看>>
Node.js:模块系统
查看>>