日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

Django Book 2.0 笔记——会话、用户和注册

發布時間:2025/3/19 编程问答 22 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Django Book 2.0 笔记——会话、用户和注册 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

2019獨角獸企業重金招聘Python工程師標準>>>

Cookies

從 request 讀取 cookies:

request.COOKIES[ " favorite_color " ]

?

向 response 寫入 cookies:

response.set_cookie( " favorite_color " ,request.GET[ " favorite_color " ])

這里是基于 GET 參數來設置 cookie

?

response.set_cookie() 的額外參數:

max_ageNone有效期(秒),None 表示持續到瀏覽器關閉
expiresNone失效的準確日期/時間,給出會覆蓋 max_age
path/cookie 生效的路徑前綴
domainNonecookie 生效的域,可用于跨域
secureFalse是否需要使用 HTTPS 傳遞本 cookie

?

Session 框架

session 框架本質上仍是基于 cookies 的,只不過他不再使用 cookies 傳送文本數據,而是其哈希值。真實的數據存儲在數據庫中,并不發送給客戶端。

?

打開 Session 功能:

  • MIDDLEWARE_CLASSES :? 'django.contrib.sessions.middleware.SessionMiddleware'
  • INSTALLED_APPS : 'django.contrib.sessions'(首次使用記得 manage.py syncdb)

?

在視圖中使用 Session:

在 session 激活后,request 中就會有一個 session 對象,這也是一個類字典類型。另外注意,這個字典的 key 應當總是簡單格式的字符串,不要以“_”開頭,也不要訪問 session 的屬性,除非你知道自己在干什么。

# Set a session value: request.session[ " fav_color " ] = " blue " # Get a session value -- this could be called in a different view, # or many requests later (or both): fav_color = request.session[ " fav_color " ] # Clear an item from the session: del request.session[ " fav_color " ] # Check if the session has a given key: if " fav_color " in request.session: ...

?

設置測試 cookie:

以下方法用于測試客戶端 cookie 是否工作正常:

# 在前面的視圖中調用 request.session.set_test_cookie() # 在后面的視圖中檢查 request.session.test_cookie_worked() # 如果工作正常,則清楚測試數據 request.session.delete_test_cookie()

?

在視圖外使用 Session:

因為 session 是以標準 model 的形式定義的,所以在視圖外部也可以直接通過 django.contrib.sessions.models.Session 來訪問。Session 的主鍵是一個 32 字節的字符串,這也是實際存儲在 cookies 中的數據。

>>> from django.contrib.sessions.models import Session >>> s = Session.objects.get(pk = ' 2b1189a188b44ad18c35e113ac6ceead ' ) >>> s.expire_date datetime.datetime( 2005 , 8 , 20 , 13 , 35 , 12 )

對 session 實際數據的訪問需要調用對象的 get_decoded() 方法

>>> s.session_data ' KGRwMQpTJ19hdXRoX3VzZXJfaWQnCnAyCkkxCnMuMTExY2ZjODI2Yj... ' >>> s.get_decoded() { ' user_id ' : 42 }

一些 Session 設置:

SESSION_SAVE_EVERY_REQUESTFalse是否每次收到請求都要更新 session
SESSION_EXPIRE_AT_BROWSER_CLOSEFalse是否將 session 有效期設置為到瀏覽器關閉為止
SESSION_COOKIE_AGE1209600當上例為 False 時,此項生效,單位為秒
SESSION_COOKIE_DOMAINNone用于跨域 cookie,字符串格式
SESSION_COOKIE_NAME"sessionid"cookie 的名字
SESSION_COOKIE_SECUREFalse是否需要使用 HTTPS 協議

?

用戶、認證與授權

Django 用戶認證系統處理:用戶、組、權限以及基于 cookie 的用戶會話。這個系統一般被稱為“auth/auth”(authentication/authorization)系統。這個名稱也表明了基本的兩步處理:驗證用戶身份,然后確認其擁有相應的權限。

基于此,auth/auth 系統包含以下部分:

  • 用戶:在網站注冊的人
  • 權限:標識用戶是否可以進行某種操作的二進制標識:yes/no
  • 組:一種批量分配權限的方法
  • Messages:向用戶顯示隊列式系統消息的方法

?

打開認證支持:

  • 確保 Session 已打開
  • INSTALLED_APP:'django.contrib.auth'
  • 在 SessionMiddleware 的 MIDDLEWARE_CLASSES 中添加:'django.contrib.auth.middleware.AuthenticationMiddleware'

在視圖中訪問用戶數據,主要通過 request.user,這個對象(auth.models.User)表示當前已登錄的用戶,如果對象還未登陸,這就是個 AnonymousUser 對象(auth.models.AnonymousUser)。

判斷用戶是否已登錄:

request.user.is_authenticated()

?

使用 User 對象:(django 1.6 版)

auth.models.User 的屬性(字段):

username必須30字符以內,允許使用字母數字 , _ , @ , +- 和 .(點)
first_name可選30字符內
last_name可選30字符內
email可選郵件地址
password必須任意字符、任意長度、不存明文
groups?多對多關系——Group
user_permissions?多對多關系——Permission
is_staff布爾值是否可以訪問 admin 頁面
is_active布爾值是否有效,需要時將其設置為 False 而不是刪除賬戶
is_superuser布爾值是否擁有所有權限
last_logindatetime默認自動更新
date_joineddatetime創建時間

auth.models.User 的方法:

get_username()返回用戶名
is_anonymous()總是返回 False
is_authenticated()總是返回 True
get_full_name()返回 first_name+last_name,中間一個空格
get_short_name()返回 first_name
set_password(raw_psw)設定密碼,若 None 則設為 unusable,不保存 User
check_password(raw_psw)驗證密碼
set_unusable_password()將用戶標記為沒有密碼,不保存 User
has_usable_password()如果上面方法被調用,則此方法返回 False
get_group_permissions(obj=None)返回用戶通過組獲取的權限字符串的集合
get_all_permissions(obj=None)返回用戶擁有的所有權限字符串的集合
has_perm(perm,obj=None)是否擁有某種權限
has_perms(perm_list,obj=None)是否擁有 perm_list 中的全部權限
has_module_perms(package_name)是否擁有某個包的全部權限
email_user(subject,message,from_email=None)給用戶發一封郵件,如果 from_email 沒有給出,就使用 DEFAULT_FROM_EMAIL

auth.models.AnonymousUser

本對象模擬了 User 的接口,不過有一些不同:

  • id 永遠是 None
  • is_staff 和 is_superuser 總是 False
  • is_active 總是 False
  • groups 和 user_permissions 總是空的
  • is_anonymous() 總是返回 True
  • is_authenticated() 總是返回 False
  • set_password() , check_password() , save() , delete() 會引發 NotImplementedError 異常

?

登陸和退出:

手動實現登陸可以使用兩個函數:authenticate() 和 login()

authenticate(username, password) 負責驗證給出的用戶名和密碼,如果驗證通過,就返回一個 User 對象

login(request,user) 則直接接受一個 request 和 user 對象作為參數,并將 user 保存到 request 的 session 中

一個極簡單的例子:

from django.contrib import auth def login_view(request): user = auth.authenticate(username = username, password = password) if user is not None and user.is_active: auth.login(request, user) return HttpResponseRedirect( " /account/loggedin/ " )

注銷一個用戶,調用 django.contrib.auth.logout(),他接受一個 request 作為參數,沒有返回值。并且即使 request 沒有登錄,本函數也不會拋出異常。

實際中,并不需要上面這樣手動實現驗證和登錄。使用內建的 login、logout 視圖函數:

from django.contrib.auth.views import login, logout urlpatterns = patterns( '' , (r ' ^accounts/login/$ ' , login), (r ' ^accounts/logout/$ ' , logout), )

/accounts/login/ 和 /accounts/logout/ 是Django提供的視圖的默認URL,可以在 settings 中修改。

缺省狀況下,login 視圖渲染 registragiton/login.html 模板(或者可以通過 template_name 參數指定其他模板)

logout視圖有一些不同。 默認情況下它渲染 registration/logged_out.html 模板(這個視圖一般包含你已經成功退出的信息)。 視圖中還可以包含一個參數 next_page 用于退出后重定向。

?

對于某些需要登錄才能訪問的視圖,可以使用 login_required 裝飾器:

from django.contrib.auth.decorators import login_required @login_required def my_view(request): # ...

這個裝飾器會在用戶未登錄時將頁面重定向至 /accounts/login/,并將當前頁面 url 當做 next 在查詢字符串中傳遞過去,例如:/accounts/login/?next=/polls/3/ ,這樣有助于用戶登陸后自動跳轉回當前頁面。

?

還有一些情況,不只需要登錄,還需要驗證相應的權限。這里同樣有一個裝飾器可用:

def user_can_vote(user): return user.is_authenticated() and user.has_perm( " polls.can_vote " ) @user_passes_test(user_can_vote, login_url = " /login/ " ) def vote(request): # Code here can assume a logged-in user with the correct permission. ...

user_passes_test 使用一個必需的參數: 一個可調用的方法,當存在 User 對象并當此用戶允許查看該頁面時返回True 。 注意 user_passes_test 不會自動檢查 User

?

管理 Users、Permissions 和 Groups

Users

因為 User 就是一個標準模型,所以使用一般性的模型操作應該就能完成任務,不過 User 還是提供了一個輔助函數 create_user() 用以創建 User 實例而不是直接調用 User 來實例化它:

>>> from django.contrib.auth.models import User >>> user = User.objects.create_user(username = ' john ' , ... email = ' jlennon@beatles.com ' , ... password = ' glass onion ' )

對 User 對象的 password 的修改,應通過 set_password() 方法來實現,因為這個屬性存儲的并不是明文。

>>> user = User.objects.get(username = ' john ' ) >>> user.set_password( ' goo goo goo joob ' ) >>> user.save()

處理注冊:

在注冊的問題上,比較有用的是 django 提供了一個內建的 Form :

from django import forms from django.contrib.auth.forms import UserCreationForm from django.http import HttpResponseRedirect def register(request): if request.method == ' POST ' : form = UserCreationForm(request.POST) if form.is_valid(): new_user = form.save() return HttpResponseRedirect( " /books/ " )

Permissions & Groups

略...

轉載于:https://my.oschina.net/lionets/blog/219697

總結

以上是生活随笔為你收集整理的Django Book 2.0 笔记——会话、用户和注册的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。