栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Python

Django|前后端分离|后端开发(三)用户相关INSTALLED

Python 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

Django|前后端分离|后端开发(三)用户相关INSTALLED

使用Django的auth机制,避免重复造轮子。

1.创建user app,在settings.py中注册

INSTALLED_APPS = [
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
    'user',
]

2.使用Django系统user,其实更好的方式是自建类继承AbstractUser类,修改系统默认用户表,但是考察了自己的系统,发现基本上用到的字段在系统表中都有涵盖,所以简单使用了系统User。

但是需要注意的是:在开始的需求分析中设置了登录注册时输入的是邮箱,所以要求都不得重复。其实应该对邮箱做正则匹配判断格式、向邮箱发验证码等,后续会再完善。

在views.py中编写视图函数:

(1)注册

def register(request):
    # 从 HTTP POST 请求中获取用户名、密码参数
    if request.method=='POST':
        req = json.loads(request.body)
        username = req.get('email')
        pwd = req.get('password')
        check_pwd = req.get('check_pwd')

        #shadow_test,123456
        filterResult = User.objects.filter(username=username)
        if len(filterResult)!=0:
            return JsonResponse({
                'ret':2,
                'msg':'该邮箱已注册'
            })

        if pwd != check_pwd:
            return JsonResponse({
                'ret': 1,
                'msg': '两次密码不相同'
            })

        user = User.objects.create_user(username=username, password=pwd)

    return JsonResponse({
        'ret':0,
        'msg':'注册成功,注册用户的id为:',
        'id':user.id

    })

这里request传参过来的写法一定注意,开始一直抛异常,没有从request中获取到参数,几个字段都为空,修改为上面的写法才成功。

使用Django自带的User类的用户创建,先手动判断两次输入的密码是否相同、该邮箱是否已经注册,创建用户。

(2)登录

def login(request):
    if request.method=='POST':
        req = json.loads(request.body)
        username = req.get('email')
        pwd = req.get('password')

        user = authenticate(username=username,password=pwd)
        if user is not None:
            if user.is_active:
                auth.login(request,user)
                #一旦注册了session,这个就变成了request.user,在所有的views函数中都可以直接使用

                #request.user表示当前登录对象,request.user=user
                request.session['usertype']='valid'
                return JsonResponse({
                    'ret':0,
                    'msg':'登录成功'
                })
            else:
                return JsonResponse({
                    'ret':1,
                    'msg':'用户已被封禁(逻辑上不存在),请联系管理员,该用户的id为',
                    'id':user.id
                })
        else:
            return JsonResponse({
                'ret':2,
                'msg':'用户名或密码错误'
            })

user = authenticate(username=username,password=pwd)语句调用User自带的authenticate方法,验证登录用户,如果用户名和密码不匹配会返回None;此外对用户是否逻辑删除做判断(is_active)。用户登录使用auth.login(),会自动将该用户信息注册到django_session表中。

一旦注册了session,当前这个登录的用户就可以用request.user来指代。

此外,需要加深对session机制的理解:https://www.jb51.net/article/182218.htm

之后为了提高性能,会考虑使用Redis缓存。

用户登录之后,session表中会增加一条记录,登出的时候该记录删除,修改用户信息后该记录也会改变。

(3)登出

# 登出处理
def logout(request):
    # 使用登出方法
    auth.logout(request)
    return JsonResponse({
        'ret': 0,
        'msg':'成功登出'
    })

(4)修改密码

def changePwd(request):
    if request.method=='POST':
        req = json.loads(request.body)
        username = req.get('email')
        pwd = req.get('password')
        new_pwd = req.get('new_pwd')
        check_pwd = req.get('check_pwd')#重复新密码

        user = User.objects.get(username=username)
        if user.check_password(pwd):
            if new_pwd == check_pwd:
                user.set_password(password=new_pwd)
                user.save()
                update_session_auth_hash(request, user)
                return JsonResponse({
                    'ret':0,
                    'msg':'密码修改成功'
                })
            else:
                return JsonResponse({
                    'ret':1,
                    'msg':'两次输入的新密码不同'
                })
        else:
            return JsonResponse({
                'ret':2,
                'msg':'原密码输入错误'
            })

但是在这里我自己遇到了一点小小的问题,我想在本机测试两个不同的账号,但是session表无论怎么更新都只有一组记录,晚点再摸索一下。

之后考虑使用修饰器@login_required,现在因为还没有摸清前后端分离架构,暂时使用

if not request.user.is_authenticated。

今晚会完成对论文、评论、收藏等的增删改查

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/935449.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号