<ruby id="bdb3f"></ruby>

    <p id="bdb3f"><cite id="bdb3f"></cite></p>

      <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
        <p id="bdb3f"><cite id="bdb3f"></cite></p>

          <pre id="bdb3f"></pre>
          <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

          <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
          <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

          <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                <ruby id="bdb3f"></ruby>

                ??一站式輕松地調用各大LLM模型接口,支持GPT4、智譜、豆包、星火、月之暗面及文生圖、文生視頻 廣告
                [TOC] 因為因特網HTTP協議的特性,每一次來自于用戶瀏覽器的請求(request)都是無狀態的、獨立的。通俗地說,就是無法保存用戶狀態,后臺服務器根本就不知道當前請求和以前及以后請求是否來自同一用戶。對于靜態網站,這可能不是個問題,而對于動態網站,尤其是京東、天貓、銀行等購物或金融網站,無法識別用戶并保持用戶狀態是致命的,根本就無法提供服務。你可以嘗試將瀏覽器的cookie功能關閉,你會發現將無法在京東登錄和購物。 <br /> 為了實現連接狀態的保持功能,網站會通過用戶的瀏覽器在用戶機器內被限定的硬盤位置中寫入一些數據,也就是所謂的Cookie。通過Cookie可以保存一些諸如用戶名、瀏覽記錄、表單記錄、登錄和注銷等各種數據。但是這種方式非常不安全,因為Cookie保存在用戶的機器上,如果Cookie被偽造、篡改或刪除,就會造成極大的安全威脅,因此,現代網站設計通常將Cookie用來保存一些不重要的內容,實際的用戶數據和狀態還是以Session會話的方式保存在服務器端。 <br /> 但是,必須清楚的是**Session依賴Cookie**!不同的地方在于Session將所有的數據都放在服務器端,用戶瀏覽器的Cookie中只會保存一個非明文的識別信息,比如哈希值。 <br /> Django提供了一個通用的Session框架,并且可以使用多種session數據的保存方式: * 保存在數據庫內 * 保存到緩存 * 保存到文件內 * 保存到cookie內 通常情況,沒有特別需求的話,請使用保存在數據庫內的方式,盡量不要保存到Cookie內。 <br /> Django的session框架默認啟用,并已經注冊在app設置內,如果真的沒有啟用,那么參考下面的內容添加有說明的那兩行,再執行migrate命令創建數據表,就可以使用session了。 ~~~ # Application definition INSTALLED_APPS = [ 'django.contrib.admin', 'django.contrib.auth', 'django.contrib.contenttypes', 'django.contrib.sessions', # 這一行 'django.contrib.messages', 'django.contrib.staticfiles', ] MIDDLEWARE = [ 'django.middleware.security.SecurityMiddleware', 'django.contrib.sessions.middleware.SessionMiddleware', # 這一行 'django.middleware.common.CommonMiddleware', 'django.middleware.csrf.CsrfViewMiddleware', 'django.contrib.auth.middleware.AuthenticationMiddleware', 'django.contrib.messages.middleware.MessageMiddleware', 'django.middleware.clickjacking.XFrameOptionsMiddleware', ] ~~~ 當session啟用后,傳遞給視圖request參數的HttpRequest對象將包含一個session屬性,就像一個字典對象一樣。你可以在Django的任何地方讀寫`request.session`屬性,或者多次編輯使用它。 <br /> 下面是session使用參考: ~~~ class backends.base.SessionBase # 這是所有會話對象的基類,包含標準的字典方法: __getitem__(key) Example: fav_color = request.session['fav_color'] __setitem__(key, value) Example: request.session['fav_color'] = 'blue' __delitem__(key) Example: del request.session['fav_color'] # 如果不存在會拋出異常 __contains__(key) Example: 'fav_color' in request.session get(key, default=None) Example: fav_color = request.session.get('fav_color', 'red') pop(key, default=__not_given) Example: fav_color = request.session.pop('fav_color', 'blue') ~~~ ~~~ # 類似字典數據類型的內置方法 keys() items() setdefault() clear() # 它還有下面的方法: flush() # 刪除當前的會話數據和會話cookie。經常用在用戶退出后,刪除會話。 set_test_cookie() # 設置一個測試cookie,用于探測用戶瀏覽器是否支持cookies。由于cookie的工作機制,你只有在下次用戶請求的時候才可以測試。 test_cookie_worked() # 返回True或者False,取決于用戶的瀏覽器是否接受測試cookie。你必須在之前先調用set_test_cookie()方法。 delete_test_cookie() # 刪除測試cookie。 set_expiry(value) # 設置cookie的有效期。可以傳遞不同類型的參數值: ? 如果值是一個整數,session將在對應的秒數后失效。例如request.session.set_expiry(300) 將在300秒后失效. ? 如果值是一個datetime或者timedelta對象, 會話將在指定的日期失效 ? 如果為0,在用戶關閉瀏覽器后失效 ? 如果為None,則將使用全局會話失效策略 失效時間從上一次會話被修改的時刻開始計時。 get_expiry_age() # 返回多少秒后失效的秒數。對于沒有自定義失效時間的會話,這等同于SESSION_COOKIE_AGE. # 這個方法接受2個可選的關鍵字參數 ? modification:會話的最后修改時間(datetime對象)。默認是當前時間。 ?expiry: 會話失效信息,可以是datetime對象,也可以是int或None get_expiry_date() # 和上面的方法類似,只是返回的是日期 get_expire_at_browser_close() # 返回True或False,根據用戶會話是否是瀏覽器關閉后就結束。 clear_expired() # 刪除已經失效的會話數據。 cycle_key() # 創建一個新的會話秘鑰用于保持當前的會話數據。django.contrib.auth.login() 會調用這個方法。 ~~~ 基本上背下來上面的內容,Django的session你就可以信手拈來了。 <br /> ## **一、使用session** 下面結合我們的項目實戰,使用session。 首先,修改`login/views.py`中的login()視圖函數: ~~~ def login(request): if request.session.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: request.session['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()) login_form = forms.UserForm() return render(request, 'login/login.html', locals()) ~~~ 通過下面的if語句,我們不允許重復登錄: ~~~ if request.session.get('is_login',None): return redirect("/index/") ~~~ 通過下面的語句,我們往session字典內寫入用戶狀態和數據: ~~~ request.session['is_login'] = True request.session['user_id'] = user.id request.session['user_name'] = user.name ~~~ 你完全可以往里面寫任何數據,不僅僅限于用戶相關! 既然有了session記錄用戶登錄狀態,那么就可以完善我們的登出視圖函數了: ~~~ def logout(request): if not request.session.get('is_login', None): # 如果本來就未登錄,也就沒有登出一說 return redirect("/login/") request.session.flush() # 或者使用下面的方法 # del request.session['is_login'] # del request.session['user_id'] # del request.session['user_name'] return redirect("/login/") ~~~ flush()方法是比較安全的一種做法,而且一次性將session中的所有內容全部清空,確保不留后患。但也有不好的地方,那就是如果你在session中夾帶了一點‘私貨’,會被一并刪除,這一點一定要注意。 <br /> ## **二、在index頁面中驗證登錄** 有了用戶狀態,就可以根據用戶登錄與否,展示不同的頁面,比如在index頁面中顯示當前用戶的名稱: 修改index.html的代碼: ~~~ <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>首頁</title> </head> <body> <h1>{{ request.session.user_name }} 歡迎回來!</h1> <p> <a href="/logout/">登出</a> </p> </body> </html> ~~~ <br /> 注意其中的模板語言,`{{ request }}`這個變量會被默認傳入模板中,可以通過圓點的調用方式,獲取它內部的`{{ request.session }}`,再進一步的獲取session中的內容。其實`{{ request }}`中的數據遠不止此,例如`{{ request.path }}`就可以獲取先前的url地址。 <br /> 重新啟動服務器,進行登錄和登出測試: ![](https://img.kancloud.cn/aa/7f/aa7fa5bf68f04090878540c017587af2_370x168.png) <br /> 可以看出,在已經login的狀態下,手動從瀏覽器地址欄中訪問/login/也依然進入的是index頁面。在logout的狀態下,都會跳轉到login頁面。但是,需要注意的是,我們目前還沒有編寫index未登錄限制訪問的代碼。 <br /> 修改index視圖函數,添加相關限制: ~~~ def index(request): if not request.session.get('is_login', None): return redirect('/login/') return render(request, 'login/index.html') ~~~
                  <ruby id="bdb3f"></ruby>

                  <p id="bdb3f"><cite id="bdb3f"></cite></p>

                    <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
                      <p id="bdb3f"><cite id="bdb3f"></cite></p>

                        <pre id="bdb3f"></pre>
                        <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

                        <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
                        <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

                        <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                              <ruby id="bdb3f"></ruby>

                              哎呀哎呀视频在线观看