django注册登录

  如果只是在数据库中创建一个用户表来实现注册登录,简单的实现会单一而薄弱,而django自带的用户表只用来登录后台,那么它的一系列验证机制就无太大用武之地了,所以,这里所说的注册登录使用django自带的用户表。

django版本1.11

一、创建用户表

可以直接使用django的用户表,但是往往还需要重新定义用户模型,因为默认的用户表中的字段未必能满足我们的需要,引入AbstractUser类作为父类,如下所示:

from django.contrib.auth.models import AbstractUser

可以添加一些我们需要的字段,如下图所示,我加入了昵称和性别字段:
自定义用户模型
然后需要在settings中配置用户模型为自定义的用户模型
注意这里是直接使用 app名 . 自定义用户模型类名
配置用户模型
执行makemigrations和migrate,生成数据变更文件并执行它,就会在数据库中生成这个表(记得配置app)

二、注册的注意事项

  注册其实就是常规的思路,目的就是在用户表中插入一条数据,所以只提及了注意事项而没有具体的实现流程,但是对于密码要使用django中的一个make_password函数进行加密

  • 使用make_password进行加密,需要先进行引入(再次的强调,因为加密的密码才能通过登录的验证)

    from django.contrib.auth.hashers import make_password
    
  • 用户名去重

  • 两次输入密码一致
  • 激活用户,设置字段 is_active=1(否则不能通过验证,无法登录)

三、登录和注销

  登录除了验证用户表中的数据,并且还要在session表中加入一条数据。其他的操作也就是一个验证session表中数据的过程。

1. 引入需要的模块

from django.contrib.auth.backends import ModelBackend #默认的验证类,作为自定义验证类的父类
from django.contrib.auth import authenticate          #进行验证的类
from django.contrib.auth import login, logout         #django中登录和注销
from django.db.models import Q                        #查询条件
from django.contrib.auth.views import login_required  #验证登录的装饰器

2. 自定义验证类

class MyBackend(ModelBackend):
    def authenticate(self, request, username=None, password=None, **kwargs):
        try:
            user = UserModel.objects.get(Q(email=username)|Q(username=username))
                          #使用 | 让邮箱和用户名都可以作为登录条件
            if user.check_password(password):
                 #这里的check_password就是把密码加密之后进行验证
                return user
            else:
                return
        except Exception as e:
            return

仍然需要在settings中配置,否则不会使用自定义的验证类
配置自定义验证类
注意逗号,元组在只有一个元素时要加上逗号,否则括号会被当成运算符,会产生不可预知的错误

3. 使用login进行登录

  从表单中得到用户名和密码之后,使用验证类进行验证,可以看到如果验证通过会返回一个user对象,使用login(request, user)就会在session表中保存登录的记录

    def post(self, request):
        form = LoginForm(request.POST)
        data = {'form': form}
        if form.is_valid():
            username = form.cleaned_data['username']
            password = form.cleaned_data['password']
            user = authenticate(request=request, username=username, password=password)
            if user:
                login(request, user)
                return redirect('/')
            else:
                data['msg'] = '用户名或密码错误!'
        else:
            data['msg'] = '请确认输入合法'
        return render(request, 'login.html', data)

4. 使用logout注销登录

  使用logout注销非常的简单,但是我们可以联想到它是删除了session表中的对应用户数据
注意重名的问题

def mylogout(request):
    logout(request)
    return redirect('/')

5. 验证是否登录

  在登录之后,request中就会有对应的用户信息
request.user.is_authenticated 可以判断用户是否登录,不仅可以在视图函数中使用,而且可以应用在模板中。
  使用 login_required 装饰器应用在一些需要登录才能操作的视图函数上,则该函数就必须在登录之后才能正常作用,否则无法进行操作,并跳转到登录的路由,登录的路由需要进行配置,如下图所示:
登录路由

猜你喜欢

转载自blog.csdn.net/xinyan233/article/details/80213249