auth認證模塊


auth模塊

在Django中創建數據庫,會自動生成一個user表,表中有很多字段
其中username, password(必填項)password用哈希算法保存到數據庫
導入auth模塊
from django.contrib import auth
django.contrib.auth中提供了許多方法,這里主要介紹其中的三個:
1.authenticate()
提供了用戶認證,即驗證用戶名以及密碼是否正確,一般需要username  password兩個關鍵字參數
如果認證信息有效,會返回一個 User 對象。authenticate()會在User 對象上設置一個屬性來標識后端已經認證了該用戶,
且該信息在后續的登錄過程中是需要的。直接從user表中拿數據對比
user = auth.authenticate(username=username, password=pwd)
2.login(HttpRequest, user) 
必須時認證成功的用戶才能用,此函數使用django的session框架給某個已認證的用戶附加上session id等信息
session不能存放對象,而login將用戶這個對象存起來,后續用到用戶信息直接調用即可
如 print(request.user.username)
user = auth.authenticate(username=username, password=pwd)
if user:
# 將登錄的用戶封裝到request.user
auth.login(request, user)
3.logout(request) 注銷用戶
def logout(request):
auth.logout(request) 相當於request.session.flush()
return redirect("/login/")
當調用該函數時,當前請求的session信息會全部清除。該用戶即使沒有登錄,使用該函數也不會報錯。
4.裝飾器:login_requierd()
使用@login_required能實現的功能:
1 用戶登陸后才能訪問某些頁面,
2 如果用戶沒有登錄就訪問該頁面的話直接跳到登錄頁面
3 用戶在跳轉的登陸界面中完成登陸后,自動訪問跳轉到之前訪問的地址
from django.contrib.auth.decorators import login_required
@login_required
def index(request):pass
若用戶沒有登錄,則會跳轉到django默認的 登錄URL '/accounts/login/ ' (這個值可以在settings.py文件中通過LOGIN_URL進行修改)
在setting中添加:
# 如果沒有登錄,默認跳轉到那個URL
LOGIN_URL = "/login/"

User對象

 
        
User 對象屬性:username, password(必填項)password用哈希算法保存到數據庫
1.is_authenticated()
如果是真正的 User 對象,返回值恆為 True 。 用於檢查用戶是否已經通過了認證。
通過認證並不意味着用戶擁有任何權限,
在后台用request.user.is_authenticated()判斷用戶是否已經登錄,如果true則可以向前台展示request.user.name
@login_required
def index(request):
ret = request.user.is_authenticated()
print(ret)
return render(request, "index.html")
2. create_user創建用戶
from django.contrib.auth.models import User
user = User.objects.create_user(username='',password='',email='')
3.check_password(passwd)校驗密碼
ret = user_obj.check_password("alex1234")正確返回True,錯誤為False
4.set_password() 修改密碼
user_obj.set_password("alex3714")
user_obj.save()
def register(request):
    from django.contrib.auth.models import User
    # User.objects.create(username="alex", password="alexdsb")  # 密碼為明文,不用這個
    創建用戶
    user_obj = User.objects.create_user(username="alex5", password="alexdsb")
    # 校驗密碼是否正確
    ret = user_obj.check_password("alex1234")
    print(ret)
    # 修改密碼
    user_obj.set_password("alex3714")
    user_obj.save()
    return HttpResponse("o98k")
手動創建認證
<h1>歡迎來到家目錄</h1>
<h3>這是{{ use_obj.username }}的家目錄</h3>
<a href="/logout/"><h4>注銷</h4></a>
from functools import  wraps
def check_login(func):
    @wraps(func)
    def inner(request,*args,**kwargs):
        rep=request.session.get('is_login')
        if rep:
            return func(request,*args,**kwargs)
        else:
            return render(request,"login.html")
    return inner
def login(request):
    if request.method=='POST':
        name=request.POST.get("username")
        pwd=request.POST.get("passwd")
        print(name,pwd)
        user=models.Userinfo.objects.filter(username=name,passwd=pwd) #得到quersty
        if user:
            request.session['is_login']='1'
            ##也可設置其他項,表中有很多字段,一個個設置比較麻煩,可直接設置id,找到其他的信息
            request.session['user_id']=user[0].id ###user是個列表
            print(request.session.get('user_id'))
            return redirect("/home/")
    return render(request,"login.html")
@check_login
def home(request):
    use_id=request.session.get('user_id')
    use_obj=models.Userinfo.objects.get(id=use_id)
    return render(request,"home.html",{"use_obj":use_obj})
def logout(request):
    request.session.flush()
    return  render(request,"login.html")
Views.py
注冊示例代碼
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) 
View Code
修改密碼示例
@login_required
def set_password(request):
    user = request.user  #auth.login(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)
View Code

擴展自帶的auth_user

1.新建一個表, 一對一關聯上面的auth_user表

在models寫入:
from django.contrib.auth.models import User
class UserDetail(models.Model):
phone = models.CharField(max_length=11)
user = models.OneToOneField(to=User) 不加引號,關聯自己創建的表時加引號

2.繼承的方式

from django.contrib.auth.models import AbstractUser
class UserInfo(AbstractUser):
phone = models.CharField(max_length=11)
addr = models.CharField(max_length=128)
相當於對默認的auth_user表做了擴展, 並且代替auth_user。auth_user不再存在
注意:
在settings.py中一定要加
AUTH_USER_MODEL = 'app名.類名'
# 告訴Django項目用哪張表做認證
AUTH_USER_MODEL = 'blog.UserInfo'


def register(request):
from django.contrib.auth.models import User
創建用戶
user_obj = User.objects.create_user(username="alex5", password="alexdsb")
使用繼承后,就沒有User了,創建新用戶需要改變
def register(request):
from app01 import models
user_obj = modles.Userinfo.objects.create_user(username="alex5", password="alexdsb"


 
 
 


免責聲明!

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



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