django2.2用户认证----注册、登录、修改密码、退出登录

项目截图

在这里插入图片描述

运行截图

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

1、建立路由

注意:login跟logout是django用户认证的内置函数,不要使用,不然会冲突报错

from user import views

app_name = 'user'

urlpatterns = [
    path('', views.index, name="index"),
    path('register/', views.register, name='register'),
    path('login/', views.user_login, name='login'),
    path('logout/', views.user_logout, name='logout'),
    # 路由保护(登录后才能访问)
    path('a/', views.a, name='a'),
    # 修改密码
    path('change_password', views.change_password, name='change_password'),
]

2、建立表单验证类forms.py,用来验证表单提交过来的数据,还有模型models.py

models.py

from django.db import models
from django.contrib.auth.models import AbstractUser


# 这里要继承AbstractUser,使用人家的东西就要按照人家的来
class User(AbstractUser):
    uid = models.AutoField(primary_key=True)
    username = models.CharField(unique=True, max_length=30)
    password = models.CharField(max_length=254)

    class Meta:
        db_table = 'user'

forms.py

from django import forms

# 表单验证类
class Form(forms.Form):
    username = forms.CharField(max_length=16, required=True, error_messages={
        'max_length': '用户名太长了(超过16给了)',
        'required': '用户名不能为空'
    })
    password = forms.CharField(min_length=2, required=True, error_messages={
        'min_length': '密码太短',
        'required': '密码不能为空'
    })

3、建立设图函数

from django.shortcuts import render, HttpResponse, redirect, reverse, HttpResponseRedirect
from django.contrib.auth import authenticate, login, logout   # 查数据库验证, 登录, 退出登录
from django.contrib.auth.decorators import login_required  # 路由保护装饰器
from user.models import User  # 用户表
from user.forms import Form  # 表单验证类(自定义的)

def register(request):
    if request.method == 'POST':
        form = Form(request.POST)
        # 验证
        if form.is_valid:
            data = request.POST.dict()
            username = data.get('username')
            password = data.get('password')
            # 写入数据库,create_user会做密码签名(加密)
            try:
                user = User.objects.create_user(username=username, password=password)
            except:
                # 插入数据库失败的其他原因
                return render(request, 'register.html', {'content': '用户名已存在'})
            if user:
                return redirect('login.html')
            else:
                # 用户名已存在的情况
                return render(request, 'register.html', {'content': '用户名已存在'})
    return render(request, 'register.html')


# 登录,不要用login,会跟用户验证中的login冲突
def user_login(request):
    if request.method == 'POST':
        form = Form(request.POST)
        # 验证
        if form.is_valid:
            data = request.POST.dict()
            username = data.get('username')
            password = data.get('password')

            # 用户验证,如果用户名和密码正确,返回user对象,否则返回None
            user = authenticate(request, username=username, password=password)
            if user:
                login(request, user)  # 记住用户登录状态,将user赋值给request
                # return redirect('/')  # 重定向
                # return redirect('user:index')  # 重定向
                return redirect(reverse('user:index'))  # 重定向
                # return HttpResponseRedirect('/')  # 重定向
                # return HttpResponseRedirect(reverse('user:index'))  # 重定向 user:index
            else:
                return render(request, 'login.html', {'content': '用户名或密码错误'})
    return render(request, 'login.html')


def user_logout(request):
    logout(request)
    return redirect(reverse('user:index'))


def index(request):
    # 判断是否登录
    if authenticate(request):
        return render(request, 'index.html')
    else:
        return render(request, 'index.html')


                # 未登录,跳转下面的路由
@login_required(login_url='user:login')
# @login_required(login_url='/login/')
def a(request):
    return HttpResponse('<h1>后台<h1>')


# 修改密码
@login_required(login_url='user:login')
def change_password(request):
    # print(request.user.username)
    if request.method == 'POST':
        # 用户验证,如果当前登录的用户名和表单输入的旧密码密码正确,则返回user对象,否则返回None
        user = authenticate(request, username=request.user.username, password=request.POST.get('old_password'))
        if user:
            try:
                if len(request.POST.get('new_password')) < 3:  # 判断新密码是否符合规则
                    return render(request, 'change_password.html', {'content': '密码长度不能小于3位'})

                user = User.objects.get(username=request.user.username)  # 获取得用户实例对象
                user.set_password(request.POST.get('new_password'))   # 修改密码
                user.save()   # 保存
            except:
                return render(request, 'change_password.html', {'content': '出错了'})

            # 无错误,则先退出登录状态,然后去到登录页面重新登录
            logout(request)
            return redirect('user:login')
        else:
            return render(request, 'change_password.html', {'content': '旧密码输入错误'})

    # GET方法
    return render(request, 'change_password.html')

templates文件夹

注册register.html

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
<h1>注册</h1>
<form action="" method="post">
    {% csrf_token %}
    用户名:<input type="text" name="username">
    密码:  <input type="password" name="password">
            <input type="submit">
</form>
</body>
</html>

登录login.html

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
<h1>登录</h1>
<form action="" method="post">
    {% csrf_token %}
    用户名:<input type="text" name="username">
    密码:  <input type="password" name="password">
            <input type="submit">
</form>
{{ content }}
</body>
</html>

index.html

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
<h1>主页</h1>
{% if request.user.is_authenticated %}
    <p>欢迎---{{ request.user.username }}---<a href="{% url 'user:logout' %}">退出登录</a>-----<a href="{% url 'user:change_password' %}">修改密码</a></p>
{% else %}
    <a href="{% url 'user:login' %}">去登录</a>
{% endif %}

</body>
</html>

修改密码change_password

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
<form action="" method="post">
    {% csrf_token %}
    旧密码:<input type="password" name="old_password">
    新密码:  <input type="password" name="new_password">
            <input type="submit">
</form>
{{ content }}
</body>
</html>

django一整套就是这样了

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值