from django.contrib import auth
from django.contrib.auth.models import User (User表)
Django 在認證組件裏自帶一個關於auth的表auth_user。css
使用命令插入數據(交互式):python manage.py createsuperuserhtml
提供了用戶認證,即驗證用戶名以及密碼是否正確,通常須要username password兩個關鍵字參數前端
若是認證信息有效,會返回一個 User 對象。authenticate()會在User 對象上設置一個屬性標識那種認證後端認證了該用戶,且該信息在後面的登陸過程當中是須要的。當咱們試圖登錄一個從數據庫中直接取出來不通過authenticate()的User對象會報錯的!!python
user = authenticate(username='someone',password='somepassword')
該函數接受一個HttpRequest對象,以及一個認證了的User對象數據庫
此函數使用django的session框架給某個已認證的用戶附加上session id等信息。npm
該函數接受一個HttpRequest對象,無返回值。當調用該函數時,當前請求的session信息會所有清除。該用戶即便沒有登陸,使用該函數也不會報錯。django
# 1:request.COOKIE.get("sessionid) #取cookie中的值 # 2:在Django - session表過濾session - key的記錄並與刪除這條記錄 # 3:刪除cookie,response.delete_cookie("sessionid") session: request.session.flush() #至關於上面3個步驟 ''' auth模塊: auth.logout(request) #至關於上面的那個步驟
若是是真正的 User 對象,返回值恆爲 True 。 用於檢查用戶是否已經經過了認證。
經過認證並不意味着用戶擁有任何權限,甚至也不檢查該用戶是否處於激活狀態,這只是代表用戶成功的經過了認證。 這個方法很重要, 在後臺用request.user.is_authenticated()判斷用戶是否已經登陸,若是true則能夠向前臺展現request.user.namebootstrap
要求:後端
1 用戶登錄後才能訪問某些頁面,bash
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的絕對路徑 (登錄成功後,會重定向到該路徑)。
(咱們以前插入用戶對象是經過命令行,但在代碼中咱們怎麼插入呢)
from django.contrib.auth.models import User user = User.objects.create_user(username='',password='',email='')
用戶須要修改密碼的時候 首先要讓他輸入原來的密碼 ,若是給定的字符串經過了密碼檢查,返回
True
user = User.objects.get(username='')#拿到用戶對象 user.set_password(password='') user.save
前提:python manage.py createsuperuser 往auth_user裏添加些數據
在項目--圖書管理系統--第五階段--加入cookie和session功能 基礎上
url.py
path('log/', views.log,name='log'), #auth登錄
path('index_user/', views.index_user,name='index_user'),#auth
views.py
from django.contrib import auth def log(request): if request.method == 'GET': return render(request, 'login.html') else: # 獲取用戶名和密碼 user = request.POST.get('user') pwd = request.POST.get('pwd') # 數據庫查詢用戶是否存在 # authenticate去auth_user查尋記錄,查詢成功返回用戶對象,失敗返回None user_obj=auth.authenticate(username=user,password=pwd) if user_obj: # 保存用戶狀態信息session,保存好後request.user(全局變量)就是當前登錄對象 auth.login(request,user_obj) #記錄user_obj的相關信息;request.session["user"]=user_obj.pk===>request.user:當前登錄用戶對象,默認是anonymousUser ''' print(request.user)#當前用戶默認匿名用戶anonymousUser print(request.user.id) print(request.user.username) #True是不是活動用戶 '''else: return redirect(reverse('login'))
def index_user(request):
if request.user.id :#或者使用request.user.is_authenticated ===> True/False
#進入到圖書管理界面,分頁
book_list = Book.objects.all()
paginator = Paginator(book_list, 5)
try: #若是取超過頁碼的頁面會報錯
current_page_num=request.GET.get('page',1) #若是取不到數據,就取第一頁的#取值page是多少
current_page=paginator.page(current_page_num)#顯示第幾頁數據
except EmptyPage as e:
current_page_num=1
current_page = paginator.page(1)
return render(request, 'index.html', {'current_page': current_page,'paginator':paginator,'current_page_num':int(current_page_num)})
else:
return redirect(reverse('login'))
def logout(request):
'''
# 1:request.COOKIE.get("sessionid) #取cookie中的值
# 2:在Django - session表過濾session - key的記錄並與刪除這條記錄
# 3:刪除cookie,response.delete_cookie("sessionid")
request.session.flush() #至關於上面3個步驟
'''
auth.logout(request) #至關於上面的那個步驟
return redirect(reverse('log'))
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>圖書管理系統登錄</title> </head> <style> *{ padding: 0; margin: 0; } .aa{ margin: 0 auto; margin-top: 100px; height: 120px; width: 200px; background-color: #4cae4c; } input{ display: block; } .right{ float: right; } .left{ float: left; } </style> <body> <div class="aa"> <form action="" method="post"> {% csrf_token %} 用戶名<input type="text" name="user"> 密 碼<input type="text" name="pwd"> <input class="right" type="submit" value="註冊"> </form> </div> </body> </html>
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>圖書管理系統登錄</title> </head> <style> *{ padding: 0; margin: 0; } .aa{ margin: 0 auto; margin-top: 100px; height: 120px; width: 200px; background-color: #4cae4c; } input{ display: block; } .right{ float: right; } .left{ float: left; } </style> <body> <div class="aa"> <form action="" method="post"> {% csrf_token %} 用戶名<input type="text" name="user"> 密 碼<input type="text" name="pwd"> <input class="right" type="submit" value="註冊"> </form> </div> </body> </html>
urls.py
path('reg/', views.reg,name='reg'), #auth註冊
views.py
def reg(request): if request.method=='GET': return render(request,'reg.html') else: user=request.POST.get('user') pwd=request.POST.get('pwd') from django.contrib.auth.models import User # User.objects.create_superuser() #建立超級用戶 User.objects.create_user(username=user,password=pwd) #建立普通用戶 return redirect(reverse('log'))
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>圖書管理系統</title> <link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/bootstrap@3.3.7/dist/css/bootstrap.min.css" integrity="sha384-BVYiiSIFeK1dGmJRAkycuHAHRg32OmUcww7on3RYdg4Va+PmSTsz/K68vbdEjh4u" crossorigin="anonymous"> <style> * { margin: 0; padding: 0; } .header { width: 100%; height: 50px; background-color: #369; } .logout{ display:block; float: right; margin-right: 50px; margin-top: 15px; } .h{ margin-left: 46%; margin-top: 10px; float: left; font-size: 20px; color: yellow; } </style> </head> <body> <div class="header"> <div> <p class="h">圖書管理系統</p> <form action="/logout/"> <input class="logout"name="logout" type="submit"value="註銷"> </form> <form action="/set_password/"method="get"> <input class="logout"name="logout" type="submit"value="修改密碼"> </form> </div> </div> <div class="container"> <div class="row"> <div class="col-md-2 "> <div class="panel panel-default"> <div class="panel-heading"><div class="btn ">功能系統</div></div> <div class="panel-body"> <div class="btn "><a href="{% url 'books' %}">圖書管理系統</a></div> <div class="btn"><a href="#">做者管理系統</a></div> <div class="btn"><a href="#">出版社管理系統</a></div> </div> </div> </div> <div class="col-md-10" style="padding-top: 20px"> {% block content %} {% endblock %} </div> </div> </div> </body> </html>
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>圖書管理系統登錄</title> </head> <style> *{ padding: 0; margin: 0; } .aa{ margin: 0 auto; margin-top: 100px; height: 120px; width: 200px; background-color: #4cae4c; } input{ display: block; } .right{ float: right; } .left{ float: left; } </style> <body> <div class="aa"> <form action="" method="post"> {% csrf_token %} 用戶名<input type="text" name="user"placeholder="{{ reqest.user.username }}"> 密 碼<input type="text" name="pwd"> <input class="right" type="submit" value="修改密碼"> </form> </div> </body> </html>
urls.py
path('set_password/', views.set_password,name='set_password'), #auth修改密碼
views.py
def set_password(request): if request.method=='GET': return render(request,'set_password.html') else: # user=request.POST.get('user') pwd=request.POST.get('pwd') user = User.objects.get(username=request.user.username) user.set_password(raw_password=pwd) user.save() return redirect(reverse('log'))