Django之用戶認證功能


前言

做web應用對登錄做用戶身份認證,然后設置session是必不可少的,因為我們就需要把有權限訪問本站視圖的用戶,單獨建一張表記錄到數據庫里;

Django作為一個大而全的框架,已經為我們做好了這些准備;

from django.shortcuts import render,HttpResponse,redirect

def login(request):
    if request.method=='GET':
        return render(request,'login.html')
    user=request.POST.get('user')
    pwd=request.POST.get('pwd')
    print(user,pwd)
    if user=='張根' and pwd=='123.com': #1、用戶認證
        request.session['name']=user      #2、屬於本站用戶設置session,識別用戶身份
        request.session['status'] = True
        return redirect('/index')
    else:
        error='用戶名/密碼錯誤'
        return render(request,'login.html',locals())


def index(request):                    #3、其他視圖,做用戶身份檢查
    status=request.session.get('status')
    if status:
        return HttpResponse('index')
    else:
        return redirect('/login/')
View Code

 

 一、認證登錄

from django.contrib import auth  導入Django自帶的認證模塊

  python manage.py createsuperuser 創建一個超級用戶,本文不涉及用戶權限管理;

 

用戶創建完成之后密碼加密成密文顯示,呵呵 人性化吧?

 

 

1  authenticate(username=username,password=password)   

 檢查用戶是存在在auth_user表及用戶名和密碼是否正確?

如果認證 成功 會返回一個 user對象,否則返回None。

 

 

2、login(HttpRequest, user) 

該函數接受一個HttpRequest對象,以及一個認證了的User對象,給用戶設置cookie+session

def log_in(request):
    if request.method=='GET':
        nextpath=request.GET.get('next','/index/')
        return render(request,'login1.html',locals())

    else:
        username=request.POST.get('username')
        password=request.POST.get('password')
        #密碼zhanggen123.com
        valid_code=request.POST.get('valid_code')
        #設置統一報錯信息
        ajax_response = {"user": None, "errors": ""}
        #如果驗證和 session中設置的驗證碼一致,
        if valid_code.upper()==request.session.get('valid_code').upper():
            # 進行用戶驗證
            user=authenticate(username=username,password=password)
            if user:
                login(request,user)
                ajax_response['user']=user.username
            else:
                ajax_response['errors'] ='用戶名/密碼錯誤'
        else:
            ajax_response['errors'] = '驗證碼錯誤'
        return HttpResponse(json.dumps(ajax_response))
View Code

 

3、  logout(request) 注銷用戶 

用戶注銷:刪除當前登錄用戶的session信息

該函數接受一個HttpRequest對象,無返回值。當調用該函數時,當前請求的session信息會全部清除。該用戶即使沒有登錄,使用該函數也不會報錯 

def log_out(request):
    logout(request)
    return redirect('/index/')

 

 4、user對象的 is_authenticated()  和@login_required

 檢查當前用戶是否驗證過?返回布爾值 true和flase

要求:

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:

from django.contrib.auth.decorators import login_required
     
@login_required 就不用在一個個視圖函數中做is_authenticated()驗證了。
def my_view(request):
  ...

若用戶沒有登錄,則會跳轉到django默認的 登錄URL '/accounts/login/ '

(這個值可以在settings文件中通過LOGIN_URL進行修改)。並傳遞  當前訪問url的絕對路徑 (登陸成功后,會重定向到該路徑)。

LOGIN_URL = '/login/ '

 

二、用戶操作相關User 對象方法  

2.1  is_authenticated()

如果是真正的 User 對象,返回值恆為 True 。 用於檢查用戶是否已經通過了認證。
通過認證並不意味着用戶擁有任何權限,甚至也不檢查該用戶是否處於激活狀態,這只是表明用戶成功的通過了認證。 這個方法很重要, 在后台用request.user.is_authenticated()判斷用戶是否已經登錄,如果true則可以向前台展示request.user.name

 

2.2  創建用戶

使用 create_user 輔助函數創建用戶:

models.UserInfo.objects.create_user(username=username,password=password,email=email,avatar=avatar)

#注意create_user中的_

 

2.3  修改用戶密碼

 set_password(passwd)

def set_password(request):
    if request.method=='GET':
        return render(request,'set_password.html')
    else:
        oldpwd=request.POST.get('oldpwd')
        newpwd = request.POST.get('newpwd')
        user=request.user
        if user.check_password(oldpwd):
            user.set_password(newpwd)
            user.save()
            return redirect('/login/')

 

2.4  check_password(passwd)

檢測用戶的密碼是否正確?如果給定的字符串通過了密碼檢查,返回 True
 

2.5 修改密碼實例

使用 set_password() 來修改密碼

def set_password(request):
    if request.method=='GET':
        return render(request,'set_password.html')
    else:
        oldpwd=request.POST.get('oldpwd')
        newpwd = request.POST.get('newpwd')
        user=request.user
        if user.check_password(oldpwd):
            user.set_password(newpwd)
            user.save()
            return redirect('/login/')

 

 

參考鏈接:http://www.cnblogs.com/yuanchenqi/articles/7439088.html#3770465  二龍湖浩哥

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM