目錄
當session啟用後,傳遞給檢視request引數的httprequest物件將包含乙個session屬性,就像乙個字典物件一樣。你可以在django的任何地方讀寫request.session屬性,或者多次編輯使用它。
這個檔案在我的c:\users\17764530215\test\mysite位址
from django.contrib import admin
from django.urls import path
from login import views
urlpatterns = [
path('admin/', admin.site.urls),
path('index/', views.index),
path('login/', views.login),
path('register/', views.register),
path('logout/', views.logout),
]策略:
(wow,這其實就是我們的功能!!)
from django.db import models
# create your models here.
class user(models.model):
gender = (
('male', "男"),
('female', "女"),
)name = models.charfield(max_length=128, unique=true)
password = models.charfield(max_length=256)
email = models.emailfield(unique=true)
*** = models.charfield(max_length=32, choices=gender, default="男")
c_time = models.datetimefield(auto_now_add=true)
def __str__(self):
return self.name
class meta:
ordering = ["-c_time"]
verbose_name = "使用者"
verbose_name_plural = "使用者"
各欄位含義:
name: 必填,最長不超過128個字元,並且唯一,也就是不能有相同姓名; password: 必填,最長不超過256個字元(實際可能不需要這麼長); email: 使用django內建的郵箱型別,並且唯一; ***: 性別,使用了乙個choice,只能選擇男或者女,預設為男; 使用__str__方法幫助人性化顯示物件資訊; 元資料裡定義使用者按建立時間的反序排列,也就是最近的最先顯示;
views.login:
def login(request):
if request.ses程式設計客棧sion.get('is_login', none): # 不允許重複登入
return redirect('/index/')
if request.method == 'post':
login_form = forms.userform(request.post) #上一次填寫了這個表單,所以從這裡得到這個表單的資料
message = '請檢查填寫的內容!'
if login_form.is_valid():
username = login_form.cleaned_data.get('username')
password = login_form.cleaned_data.get('password')
try:
user = models.user.objects.get(name=username)
except :
message = '使用者不存在!'
return render(request, 'login/login.html', locals())
if user.password == password: #如果使用者名稱和密碼都成功
# 往session字典內寫入使用者狀態和資料:
request.session['is_login'] = true #is_login=true表示成功登陸
request.session['user_id'] = user.id
request.session['user_name'] = user.name
return redirect('/index/') #重定向到主頁
else:
message = '密碼不正確!'
return render(request, 'login/login.html', locals())
else:
return render(request, 'login/login.html', locals())
# 不是post的話,統統轉去login.html
login_form = forms.userform()
return render(request, 'login/login.html', locals())
我們進入login時,會去session裡面找is_login項,如果為true就表示已經登陸了,所以就重定向到/index/中,進入首頁.
如果為false,即沒有登陸,那麼往下走。如果是post方法,那麼執行一系列操作,如果不是post,就表示是第一次用get的方式登陸到這個login網頁的,那麼就用forms.userform產生乙個物件login_form,將其作為引數傳到login/login.html模板檔案中,待會再介紹這個檔案。
如果為false,且是post時,就表明是填寫了表單的,這裡就涉及很多業務邏輯和session的管理了,重點講。如果login_form.is_valid() 如下:通過login_form = forms.userform(request.post)得到填寫的這個表單資料,然後去和資料庫的使用者名稱密碼去驗證,如果通過了,那麼就將request.session['is_login']改為true,表示在登陸狀態,並且把user_id和user_name欄位也改成對應的資料,這個之後應該有用.
下面進入login/login.html
登入這裡重要的地方是這個語句——},在這個位置插入了乙個表單login_form,然後填寫好這個表單以後,用view裡面的login函式通過執行login_form = forms.userform(request.post)來獲取填寫的這個表單資料,然後去進行校驗等等操作...
有了這兩個,我們的許可權管理就基本完成了!本質上,這倆東西提供了一種機制————可以對輸入的使用者資料存在session裡,然後校驗的時候從session中取出,去判斷是否是合法的使用者。那麼,我們只需要再修改一下index.html,也是用session去校驗,這樣,直接通過**訪問的使用者,由於沒有session,就會被攔截!
def index(request):
if not request.session.get('is_login', none): #如果不在登陸狀態,就重定向到login
return redirect('/login/')
return render(request, 'login/index.html') #如果在登陸狀態,就進入index.html的模板檔案
這裡邏輯很清楚:如果不在登陸狀態,就重定向到login;如果在登陸狀態,就直接重定向到真正的login/index.html模板。在這麼模板中,我們就可以開發各種功能了,該demo中的login/index/html如下:
Django中session和cookie的用法
session 存在伺服器端,用request物件進行設定 設定session 在後端寫入 request.session money 100 缺省會在cookie中產生乙個sessionid 獲取session值 只能在後端獲取 print request.session.get money co...
Django中session的使用
1 存在於服務端的鍵值對 2同乙個瀏覽器不允許登入多個賬戶,不同瀏覽器可以登入同乙個賬戶 3session的使用 必須遷移資料 增 request.session name lqz 查 request.session name 改 request.session name egon 刪 del re...
Django的session中對於使用者驗證的支援
使用者與authentication 通過session,我們可以在多次瀏覽器請求中保持資料,接下來的部分就是用session來處理使用者登入了。當然,不能僅憑使用者的一面之詞,我們就相信,所以我們需要認證。當然了,django 也提供了工具來處理這樣的常見任務 就像其他常見任務一樣 django ...