Django Auth模塊及User對象方法

一:Django的用戶認證
  from django.contrib import auth
  django.contrib.auth中提供了許多方法,這裏主要介紹其中的三個:html

  1:authenticate()
    提供了用戶認證,即驗證用戶名以及密碼是否正確,通常須要username password兩個關鍵字參數
    若是認證信息有效,會返回一個 User 對象。authenticate()會在User 對象上設置一個屬性標識那種認證後端認證了該用戶,且該信息在後面的登陸過程當中是須要的。當咱們試圖登錄一個從數據庫中直接取出來不通過authenticate()的User對象會報錯的!
    user = authenticate(username='someone',password='somepassword')python

  2:login(HttpRequest,user)數據庫

    該函數接受一個HttpRequest對象,以及一個認證了的User對象
    此函數使用django的session框架給某個已認證的用戶附加上session id等信息。    django

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.
    ...

  3  logout(request) 註銷用戶後端

from django.contrib.auth import logout
  
def logout_view(request):
  logout(request)

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

  4 user對象的 is_authenticated()框架

  要求:函數

    1 用戶登錄後才能訪問某些頁面,
    2 若是用戶沒有登陸就訪問該頁面的話直接跳到登陸頁面
    3 用戶在跳轉的登錄界面中完成登錄後,自動訪問跳轉到以前訪問的地址ui

    django已經爲咱們設計好了一個用於此種狀況的裝飾器:login_requierd()url

    在settings中,添加以下內容

# 判斷用戶若是沒有登陸,重定向到登陸頁面
LOGIN_URL='/index/'

   

from django.contrib.auth.decorators import login_required
     
@login_required
def my_view(request):
  ...

若用戶沒有登陸,則會跳轉到django默認的 登陸URL '/index/ ' (這個值能夠在settings文件中經過LOGIN_URL進行修改)。並傳遞  當前訪問url的絕對路徑 (登錄成功後,會重定向到該路徑)。

示例:

# 登陸
def index(request):
    err_msg = ""
    if request.method == 'POST':
        username = request.POST.get('username')
        password = request.POST.get('password')
        # 使用auth模塊進行驗證
        user = authenticate(username=username,password=password)

        # 使用auth模塊進行登陸
        if user is not None:
            login(request,user)
            return redirect(reverse('userlist'))
        else:
            err_msg = "用戶名或密碼不正確"
    return render(request,'index.html',{'err_msg':err_msg})

# 退出
def log_out(request):
    logout(request)
    return redirect(reverse('index'))

====================================

二:User對象    

  1:建立用戶

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

from django.contrib.auth.models import User
user = User.objects.create_user(username='',password='',email='')

  2:set_password(passwd)

  這個方法是用來更改密碼的,使用步驟:  

user=User.objects.get(username='')
user.set_password(passeord='')
user.save

  3:check_password(passwd)

    用戶須要修改密碼的時候 首先要讓他輸入原來的密碼 ,若是給定的字符串經過了密碼檢查,返回 True

示例:  

# 添加用戶
def admin_add(request):
    ......
    if request.method == "POST":
        # 在auth_user表中添加數據
        username = request.POST.get('username')
        password = request.POST.get('password')
        add_admin = User.objects.create_user(username=username, password=password)
        add_admin.save()
        return redirect(rev_url(request,'admin_list'))
    else:
        error_msg = "用戶名已存在"
    return render(request, "change.html", {'form_obj': admin_obj,
                                           "error_msg":error_msg})
# 修改密碼
@login_required
def set_pwd(request):
    user = request.user
    state = ""
    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 = '新密碼不能爲空'
            elif new_password != repeat_password:
                state = '兩次密碼不一致'
            else:
                user.set_password(new_password)
                user.save()
                # 註銷,跳轉到index頁面
                logout(request)
                return redirect("/index/")
        else:
            state = '密碼不正確'
    content = {
        'user': user,
        'state': state,
    }
    return render(request, 'change_pwd.html', content)
相關文章
相關標籤/搜索