前言
做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/')

一、認證登錄
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))
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 二龍湖浩哥
