概要:html
form組件回顧: (1) 建立form組件對應的類,好比LoginForm (2) views.login: if get請求: form_obj=LoginForm() return render(request,"login.html",{"form_obj":form_obj}) # 由form_obj渲染form表單的有效控件 渲染方式三種: 1 <form action="" novalidate method="post"> {% csrf_token %} {{ form_obj.as_p }} <input type="submit"> </form> 2 <form action="" novalidate method="post"> {% csrf_token %} <div> <label for="">用戶名</label> {{ form_obj.user }} <span>{{ form_obj.errors.user.0 }}</span> </div> <div> <label for="">密碼</label> {{ form_obj.pwd }}<span>{{ form_obj.errors.pwd.0 }}</span> </div> <input type="submit"> </form> 3 <form action="" novalidate method="post"> {% csrf_token %} {% for field in form_obj %} <div> <label for="">{{ field.label }}</label> {{ field }} </div> {% endfor %} <input type="submit"> </form> if post請求: form_obj = LoginFrom(request.POST) if form_obj.is_valid(): form_obj.cleaned_data # 全部的有效數據 else: #form_obj.errors # {} #form_obj.errors.get("user") # [] return render(request, "login.html", {"form_obj": form_obj}) 2 auth --- django的認證系統 A S session寫操做 request.session["user"]=user ''' 一、生成隨機字符串 二、寫cookie {"sessionID":"234asd243dv35fd"} 三、django-session表: session-key session-data 234asd243dv35fd {"user":"alex"} ''' session讀操做 user=request.session.get("user") ''' 1 {"sessionID":"234asd243dv35fd"} 2 django-session表: session-key session-data 234asd243dv35fd {"user":"alex"} 3 {"user":"alex"}.get("user") ''' request.session究竟是什麼? 認證系統: request.user 1 使用auth_user表做爲用戶表 2 登陸: user=auth.authenticate(username=user,password=pwd) auth.login(request,user) # session寫操做 3 註銷 auth.logout(request) # session刪操做 request.session.flush() 4 驗證 user.is_authenticated() # 登陸狀態時,返回True,不然返回False 5 建立用戶:User.objects.create_user(username="egon123",password="1234") 今日做業: 1 看 session 中間件源碼 2 基於用戶認證明現 登陸註冊註銷功能,登陸用戶與未登陸用戶顯示不一樣頁面
咱們的登陸驗證是瀏覽器級別的驗證還有用戶級別的驗證,前端
使用咱們的django內部的數據庫表,auth_user,而後使用它內部的一些模塊和方法數據庫
在視圖函數裏面須要引入模塊寫邏輯代碼:django
from django.shortcuts import render,redirect
# Create your views here.
from django.contrib import auth
from django.contrib.auth.models import User
# 以上兩句是固定模式,
def log_in(request):
if request.method=="POST":
user=request.POST.get("user")
pwd=request.POST.get("pwd")
# 驗證成功,返回user對象,不然返回None
user=auth.authenticate(username=user,password=pwd)
if user:
auth.login(request,user) # session寫操做
return redirect("/index/")
return render(request,"login.html")
def index(request):
print(request.user)
print(type(request.user))
# if not request.user.id:
# return redirect("/login/")
# user=request.user
# if not user.is_authenticated():return redirect("/login/")
return render(request,"index.html",locals())
def log_out(request):
auth.logout(request)
return redirect("/login/")
def reg(request):
User.objects.create_user(username="egon123",password="1234")
return redirect("/login/")
authenticate()後端
提供用戶認證,即驗證用戶名以及密碼是否正確,通常須要表中的username,password連個關鍵字參數.瀏覽器
若是認證信息有效,會返回一個user對象,authenticate()會在user對象上設置一個屬性,表示那種認證後端認證了該用戶,且該信息在後面的登陸過程當中是須要的,當咱們試圖登陸一個從數據庫中取出來不通過authenticate()的user對象會報錯!cookie
在驗證中咱們有幾種狀態固定語句:session
登陸:login框架
user1=auth.authenticate(username=user,password=pwd)ide
auth.login(request,user1) # 相似於session寫操做
此函數使用django的session框架給某個已經認證的用戶附加上session等信息
==============================================================
退出登陸狀態:logout
auth.logout(request)
request.session.flush()
該函數接收一個httprequest的對象沒有返回值,當調用該函數的時候,當前請求的session信息會所有清除,該用戶沒有登陸,使用該函數也不會報錯.
=================================================
驗證 :User對象的is_authenticated()方法
user.is_authenticated()
登陸狀態時,返回True,不然返回False
1,當用戶登陸時才能夠訪問某些頁面,(有點相似於咱們的cookie和session設置的狀態)
2,若是沒有登陸,系統會檢測到,而後強行讓用戶去登陸,會自動就把頁面跳轉到登陸頁面去
3,用戶在跳轉的登陸界面中完成了登陸後,自動訪問到跳轉登陸以前所訪問的地址
方法一:
def login(request):
if not request.user.is_authenticated():
return redirect('%s?next=%s' % (settings.LONGING_URL,request.path)) # 這裏是比較簡單的
方法二:
from django.contrib.auth.decorators import login_required
@login_required
def login(request):
```````
若是用戶沒有登陸的話,會跳轉到django默認的登陸url'/accounts/login/'(這裏的值經過settings文件中LOGIN_URL進行修改).並傳遞,當前訪問url的絕對路徑(登陸成功後,會重定向到該路徑)
===================================================
建立用戶:
user.objects.create_user(username='egon',password='1234')
User對象:
若是是真正的user對象,返回值恆爲True.用於檢查用戶是否已經經過了認證,經過認證並不意味着用戶擁有任何權限,甚至也不檢查該用戶是否處於激活狀態,這只是表名用戶成功經過了認證.在後臺用request.user.is_authenticated()判斷用戶是否已經登陸,若是True則能夠向前臺展現request.user.name
check_password(passwd)
用戶修改密碼以前讓其輸入原來的密碼進行校驗,經過了驗證以後返回True
而後使用set_password()來修改密碼
咱們下面的示例就是一個簡單的index頁面,咱們的用戶若是登陸的話就能夠看到該頁面的設置了用戶權限的信息,
若是沒有登陸就會看到這個頁面沒有設置用戶權限的信息.這兩種狀態都是經過咱們的auth內置方法去實現的.
具體代碼以下,
views視圖函數:
from django.shortcuts import render, redirect # Create your views here. from django.contrib import auth from django.contrib.auth.models import User # 登陸+註冊頁面 def login1(request): if request.method == 'POST': user = request.POST.get('user') pwd = request.POST.get('pwd') username = auth.authenticate(username=user, password=pwd) if username: auth.login(request, username) return redirect('/auth/index1/') else: # 這裏就是註冊,create_user這一句話就完成了註冊效果 User.objects.create_user(username=user, password=pwd) return redirect('/auth/index1') return render(request, 'proof/login1.html') # 登陸與否皆可顯示該頁面效果 def index1(request): user = request.user return render(request, 'proof/index1.html', locals()) # 註銷 def out(request): auth.logout(request) return redirect('/auth/login1') # 註冊頁面 def reg(request): return redirect('/auth/login1') # 修改密碼 def set_pwd(request): user = request.user state = None if request.method == 'POST': old_pwd = request.POST.get("old_pwd",) new_pwd = request.POST.get('new_pwd',) repeat_password = request.POST.get('repeat_pwd',) if user.check_password(old_pwd): if not new_pwd: state = 'empty' elif new_pwd != repeat_password: state = 'repeat_error' else: user.set_password(new_pwd) user.save() return redirect('/auth/login1') else: # 咱們這裏是在作邏輯判斷,若是咱們在修改的密碼的時候不當心輸錯了, # 咱們的頁面須要有提示信息告訴用戶輸入錯誤請從新輸入 state = '密碼有誤,請覈對後再輸' content = { # 這裏的字典是什麼意思啊,使用locals把這個content傳到咱們的模板裏面而後若是輸入密碼有誤的話 # 就顯示下面的這個字符串: {'user': <SimpleLazyObject: <User: wusir>>, 'state': '密碼有誤,請覈對後再輸'}, # 老師的代碼裏面直接寫的content,我也不知道這個content須要放到哪裏去,唉 'user': user, 'state': state, } return render(request, 'proof/set_password.html', locals()) return render(request, 'proof/set_password.html')
前端HTML頁面:
登陸/註冊頁面
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta http-equiv="X-UA-Compatible" content="IE=edge"> <meta name="viewport" content="width=device-width, initial-scale=1"> <title>index1</title> </head> <body> {#<form action="/auth/index1/" method="post">#} <form action="" method="post"> {% csrf_token %} <p>用戶名 <input type="text" name="user"></p> <p>密碼 <input type="password" name="pwd"></p> <input type="submit"> </form> </body> </html>
index頁面(在這裏進行邏輯判斷用戶是不是登陸狀態):
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta http-equiv="X-UA-Compatible" content="IE=edge"> <meta name="viewport" content="width=device-width, initial-scale=1"> <title>index1</title> <style> .a1{ float:right } </style> </head> <body> <h1>welcome here</h1> <p>hello {{ user }}</p> <hr> {% if request.user.is_authenticated %} <a class="a1" href="/auth/out/">註銷</a> <a class="a1" href="/auth/set_pwd">修改密碼</a> <h2>you're coming home {{ request.user.username }}</h2> {% else %} {# 咱們這裏不用後端的視圖函數去作判斷,就直接用咱們的前端的模板語言的邏輯去作篩選#} <a href="/auth/login1/">登陸</a> <a href="/auth/reg/">註冊</a> {% endif %} </body> </html>
修改密碼頁面:
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta http-equiv="X-UA-Compatible" content="IE=edge"> <meta name="viewport" content="width=device-width, initial-scale=1"> <title>Title</title> </head> <body> <form action="" method="post"> {% csrf_token %} <div>舊密碼: <input type="password" name="old_pwd"><span>{{ content }}</span></div> <p>新密碼: <input type="password" name="new_pwd"></p> <div>確認密碼: <input type="password" name="repeat_pwd"></div> <button type="submit" value="put in">提交</button> </form> <script> </script> </body> </html>
url配置:
from django.conf.urls import url from auth1 import views, session urlpatterns = [ url(r'^login1/$', views.login1), url(r'^reg/$', views.reg), url(r'^index1/$', views.index1), url(r'^out/$', views.out), url(r'^set_pwd/$', views.set_pwd), ]