Django 的用户认证组件

用户认证

auth模块

 from django.contrib import auth 

django.contrib.auth中提供了许多方法,主要的三个:

1.1 authenticate() 

提供了用户认证,即验证用户名以及密码是否正确,一般需要username  password两个关键字参数如果认证信息有效,会返回一个 User 对象。authenticate()会在User 对象上设置一个属性标识那种认证后端认证了该用户,且该信息在后面的登录过程中是需要的。当我们试图登陆一个从数据库中直接取出来不经过authenticate()的User对象会报错的!!

user = auth.authenticate(username='someone',password='somepassword')

1.2 login(HttpRequest, user)  

该函数接受一个HttpRequest对象,以及一个认证了的User对象

此函数使用django的session框架给某个已认证的用户附加上session id等信息。

from django.contrib.auth import authenticate, login

def my_view(request):
  username = request.POST['username']
  password = request.POST['password']
  user = authenticate(username=username, password=password)
  if user is not None:
    login(request, user)
    # Redirect to a success page.
    ...
  else:
    # Return an 'invalid login' error message.
    ...

1.3 logout(request) 注销用户

from django.contrib.auth import logout

def logout_view(request):
  logout(request)
  # Redirect to a success page.
该函数接受一个HttpRequest对象,无返回值。当调用该函数时,当前请求的session信息会全部清除。该用户即使没有登录,使用该函数也不会报错。

User对象

User 对象属性:username, password(必填项)password用哈希算法保存到数据库

2.1 user对象的 is_authenticated()

如果是真正的 User 对象,返回值恒为 True 。 用于检查用户是否已经通过了认证。
通过认证并不意味着用户拥有任何权限,甚至也不检查该用户是否处于激活状态,这只是表明用户成功的通过了认证。 这个方法很重要, 在后台用request.user.is_authenticated()判断用户是否已经登录,如果true则可以向前台展示request.user.name

要求:

  • 1  用户登陆后才能访问某些页面,
  • 2  如果用户没有登录就访问该页面的话直接跳到登录页面
  • 3  用户在跳转的登陆界面中完成登陆后,自动访问跳转到之前访问的地址
方法1:
def my_view(request):
  if not request.user.is_authenticated():
    return redirect('%s?next=%s' % (settings.LOGIN_URL, request.path))
方法2:
django已经为我们设计好了一个用于此种情况的装饰器:login_requierd()
from django.contrib.auth.decorators import login_required
@login_required
def my_view(request):
  ...

若用户没有登录,则会跳转到django默认的 登录URL '/accounts/login/ ' (这个值可以在settings文件中通过LOGIN_URL进行修改)。并传递  当前访问url的绝对路径 (登陆成功后,会重定向到该路径)

2.2 创建用户

使用 create_user 辅助函数创建用户:

from django.contrib.auth.models import User

user = User.objects.create_user(username='',password='',email='')

2.3 check_password(passwd)

用户需要修改密码的时候 首先要让他输入原来的密码 ,如果给定的字符串通过了密码检查,返回 True

2.4 修改密码

使用 set_password() 来修改密码

user = User.objects.get(username='')

user.set_password(password='')

user.save 

2.5 、简单示例

def sign_up(request):

    state = None
    if request.method == 'POST':

        password = request.POST.get('password', '')
        repeat_password = request.POST.get('repeat_password', '')
        email=request.POST.get('email', '')
        username = request.POST.get('username', '')
        if User.objects.filter(username=username):
                state = 'user_exist'
        else:
                new_user = User.objects.create_user(username=username, password=password,email=email)
                new_user.save()

                return redirect('/book/')
    content = {
        'state': state,
        'user': None,
    }
    return render(request, 'sign_up.html', content)
注册
@login_required
def set_password(request):
    user = request.user
    state = None
    if request.method == 'POST':
        old_password = request.POST.get('old_password', '')
        new_password = request.POST.get('new_password', '')
        repeat_password = request.POST.get('repeat_password', '')
        if user.check_password(old_password):
            if not new_password:
                state = 'empty'
            elif new_password != repeat_password:
                state = 'repeat_error'
            else:
                user.set_password(new_password)
                user.save()
                return redirect("/log_in/")
        else:
            state = 'password_error'
    content = {
        'user': user,
        'state': state,
    }
    return render(request, 'set_password.html', content)
修改密码

 

用户认证,前提是使用的时django的那张user表

from django.shortcuts import render, redirect

from django.contrib import auth
from django.contrib.auth.models import User
from django.contrib.auth.decorators import login_required


def login(request):
    if request.method == "POST":
        user = request.POST.get("user")
        pwd = request.POST.get("pwd")

        # if 验证成功返回user对象,否则返回None
        user = auth.authenticate(username=user, password=pwd)  # 调用的是django 内置的user认证模块

        if user:  # 认证成功就返回user对象
            auth.login(request, user)  # request.user:当前登录对象

            next_url = request.GET.get("next", "/index/")
            return redirect(next_url)

    return render(request, "login.html")


@login_required
def index(request):
    # print("request.user:",request.user.username)
    # print("request.user:",request.user.id)
    # print("request.user:",request.user.is_anonymous)
    #
    # #if request.user.is_anonymous:
    # if not request.user.is_authenticated:
    #     return redirect("/login/")

    # username=request.user.username
    # return render(request,"index.html",{"username":username})

    return render(request, "index.html")


@login_required
def order(request):
    # if not request.user.is_authenticated:
    #     return redirect("/login/")

    return render(request, "order.html")


def logout(request):
    auth.logout(request)

    return redirect("/login/")


def reg(request):
    if request.method == "POST":
        user = request.POST.get("user")
        pwd = request.POST.get("pwd")

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

        return redirect("/login/")

    return render(request, "reg.html")

View
posted @ 2019-03-12 21:05  元贞  阅读(310)  评论(0编辑  收藏  举报