django -- auth模块

前戏

咱们在开发项目的时候,不免要遇到用户权限的问题,例如这个用户是否是能够访问这个页面,是否是能够登陆,帐号是否是已通过期了等等的缘由,django给咱们提供了auth模块,能很方便的解决咱们的这些问题。html

django给咱们提供了一个后台管理系统,咱们先来建立一个超级用户,在项目跟目录下执行下面命令python

python manage.py createsuperuser

执行成功以后,咱们就在默认的auth_user表里建立了一个用户数据库

咱们能够登陆到后台看看django

User下的数据就是咱们数据表auth_user里的数据,方便咱们进行数据的更改。后端

authenticate

给咱们提供了用户认证功能,就是验证咱们的用户名和密码是否是正确的。通常须要username和password两个参数,若是认证成功,则返回一个User对象,若是认证失败,则返回Nonecookie

authenticate()会在该 User 对象上设置一个属性来标识后端已经认证了该用户,且该信息在后续的登陆过程当中是须要的。session

咱们能够写一个登陆函数,来判断咱们输入的用户名和密码是否是正确的,咱们上面已经注册了一个帐号和密码app

 1 from django.contrib import auth  2 
 3 
 4 def login(request):  5     if request.method == 'POST':  6         username = request.POST.get('username')  7         pwd = request.POST.get('pwd')  8         obj = auth.authenticate(request, username=username, password=pwd)  9         print(obj) 10         if obj: 11             return redirect('/index/') 12 
13     return render(request, 'login.html')

代码解释:函数

第八行咱们经过authenticate进行判断用户名和密码是否是正确,里面有三个参数,第一个是request,第二个是用户名,前面的username是数据库里的字段名,后面的是用户输入的值,第三个是密码。若是验证经过,则obj是一个User对象,若是验证失败,则obj为Noneui

 login()

该函数实现一个用户登陆的功能,它会在后端为该用户生成一个seeeion数据,存在django_session表里。

该函数接收一个HttpRequest对象,以及一个通过认证的User对象。

1 def login(request): 2     if request.method == 'POST': 3         username = request.POST.get('username') 4         pwd = request.POST.get('pwd') 5         obj = auth.authenticate(request, username=username, password=pwd) 6         if obj: 7             auth.login(request, obj)  # obj是上面认证返回的对象
8             return redirect('/index/') 9     return render(request, 'login.html')

这样,当咱们执行到第七行的时候,会自动为咱们生成session。

logout()

当调用该函数时,当前请求的session信息会所有清除,该用户即便没有登陆,使用该方法也不会报错,接收一个HttpRequest对象,无返回值。

咱们在上面登陆成功以后会进入到index页面,在index视图里写个注销的功能

def index(request): auth.logout(request) # 清除用户的session数据
    return redirect('/login/')

login_requierd()

有些页面咱们须要用户登陆成功以后才能访问,在以前咱们经过给设置cookie,获取cookie的方法来判断,django给咱们提供了这样的功能,使用装饰器login_requierd()就能实现,首先须要导入

from django.contrib.auth.decorators import login_required

咱们给index视图加上装饰器,在没登陆的状态下访问

from django.contrib.auth.decorators import login_required @login_required # 使用装饰器添加登陆校验
def index(request): return HttpResponse('index')

django报错,提示咱们

Not Found: /accounts/login/

这是由于若是没有登陆,django会跳转到 /accounts/login/ 这个路由,由于这个咱们没有定义,因此会报错,咱们把login改为 /accounts/login/ 就会跳转到登陆页面了,若是不想改,就想用login。能够在settings.py里加上下面的代码

LOGIN_URL = '/login/'  # 这里配置成你项目登陆页面的路由

这样咱们就能使用咱们自定义的路由了,访问index页面,若是没有登陆,跳转的路由为

http://127.0.0.1:8000/login/?next=/index/

在上面登陆的视图函数里,咱们登陆成功后会访问固定的页面index,可是咱们多是从home页面访问的,登陆以后还想回到home页面,这时咱们就能够修改login视图函数了

def login(request): if request.method == 'POST': username = request.POST.get('username') pwd = request.POST.get('pwd') obj = auth.authenticate(request, username=username, password=pwd) if obj: auth.login(request, obj) # obj是上面认证返回的对象
            next_page = request.GET.get('next')  # django给咱们提供的参数是next,因此咱们经过next拿到对应的值,在经过重定向跳转到对应的页面
            if next_page: return redirect(next_page) return HttpResponse('ok') return render(request, 'login.html')

 is_authenticated()

用来判断当前请求是否经过了认证,经过了返回True,没经过返回False

from django.contrib.auth.decorators import login_required def login(request): if request.method == 'POST': username = request.POST.get('username') pwd = request.POST.get('pwd') obj = auth.authenticate(request, username=username, password=pwd) if obj: auth.login(request, obj) # obj是上面认证返回的对象
            next_page = request.GET.get('next')  # django给咱们提供的参数是next
            if next_page: return redirect(next_page) return HttpResponse('ok') return render(request, 'login.html') @login_required # 使用装饰器添加登陆校验
def index(request): print(request.user, type(request.user))  # 当前的用户对象
    print(request.user.is_authenticated())  # 判断当前用户是否登陆

    return HttpResponse('index')

create_user()

建立新用户的方法,必需要提供username,password参数。也能够指定其余参数

要导入对应的模块

from django.contrib.auth.models import User
from django.contrib.auth.models import User def register(request): if request.method == 'POST': user = request.POST.get('username') pwd = request.POST.get('password') User.objects.create_user(username=user, password=pwd)  # 建立一个用户
        return redirect('/login/') return render(request, 'register.html')

指定其余参数,数据库里要有这个字段

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

create_superuser()

建立一个超级用户,能够登陆到后台

语法和上面的同样

from django.contrib.auth.models import User User.objects.create_superuser(email='',username=user, password=pwd)  # 有三个参数,email在这里写死了

check_password()

auth 提供的一个检查密码是否正确的方法,须要提供当前请求用户的密码。

密码正确返回True,不然返回False。

 

user.check_password('密码')

set_password()

auth 提供的一个修改密码的方法,接收 要设置的新密码做为参数。

注意:要使用save()方法才能保存到数据库里面

from django.contrib.auth.models import User user.set_password(password='新密码') user.save()

自定义auth_user表

django虽然给咱们提供了user表来存储用户的注册帐号等信息,但不能知足咱们实际项目的需求,好比咱们还须要用户填地址,手机号等等信息。

咱们能够经过继承内置的 AbstractUser 类,来定义一个本身的Model类。

from django.contrib.auth.models import AbstractUser class UserInfo(AbstractUser): addr = models.CharField(max_length=32) phone = models.CharField(max_length=11)

注意:

按上面的方式扩展了内置的auth_user表以后,必定要在settings.py中告诉Django,我如今使用我新定义的UserInfo表来作用户认证。写法以下:

# 引用Django自带的User表,继承使用时须要设置
AUTH_USER_MODEL = "app名.UserInfo"

一旦咱们指定了新的认证系统所使用的表,咱们就须要从新在数据库中建立该表,而不能继续使用原来默认的auth_user表了。

相关文章
相关标签/搜索