在Python的Django架構的視圖中使用Session的方法

來源:互聯網
上載者:User
SessionMiddleware 啟用後,每個傳給視圖(view)函數的第一個參數``HttpRequest`` 對象都有一個 session 屬性,這是一個字典型的對象。 你可以象用普通字典一樣來用它。 例如,在視圖(view)中你可以這樣用:

# 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: ...

其他的映射方法,如 keys() 和 items() 對 request.session 同樣有效:

下面是一些有效使用Django sessions的簡單規則:

用正常的字串作為key來訪問字典 request.session , 而不是整數、對象或其它什麼的。

Session字典中以底線開頭的key值是Django內部保留key值。 架構只會用很少的幾個底線 開頭的session變數,除非你知道他們的具體含義,而且願意跟上Django的變化,否則,最好 不要用這些底線開頭的變數,它們會讓Django攪亂你的應用。

比如,不要象這樣使用`` _fav_color`` 工作階段金鑰(session key):

request.session['_fav_color'] = 'blue' # Don't do this!

不要用一個新對象來替換掉 request.session ,也不要存取其屬性。 可以像Python中的字典那樣使用。 例如:

request.session = some_other_object # Don't do this!request.session.foo = 'bar' # Don't do this!

我們來看個簡單的例子。 這是個簡單到不能再簡單的例子:在使用者發了一次評論後將has_commented設定為True。 這是個簡單(但不很安全)的、防止使用者多次評論的方法。

def post_comment(request): if request.method != 'POST':  raise Http404('Only POSTs are allowed') if 'comment' not in request.POST:  raise Http404('Comment not submitted') if request.session.get('has_commented', False):  return HttpResponse("You've already commented.") c = comments.Comment(comment=request.POST['comment']) c.save() request.session['has_commented'] = True return HttpResponse('Thanks for your comment!')

下面是一個很簡單的網站登入視圖(view):

def login(request): if request.method != 'POST':  raise Http404('Only POSTs are allowed') try:  m = Member.objects.get(username=request.POST['username'])  if m.password == request.POST['password']:   request.session['member_id'] = m.id   return HttpResponseRedirect('/you-are-logged-in/') except Member.DoesNotExist:  return HttpResponse("Your username and password didn't match.")

下面的例子將登出一個在上面已通過`` login()`` 登入的使用者:

def logout(request): try:  del request.session['member_id'] except KeyError:  pass return HttpResponse("You're logged out.")

注意

在實踐中,這是很爛的使用者登入方式,稍後討論的認證(authentication )架構會幫你以更健壯和有利的方式來處理這些問題。 這些非常簡單的例子只是想讓你知道這一切是如何工作的。 這些執行個體盡量簡單,這樣你可以更容易看到發生了什麼
設定測試Cookies

就像前面提到的,你不能指望所有的瀏覽器都可以接受cookie。 因此,為了使用方便,Django提供了一個簡單的方法來測試使用者的瀏覽器是否接受cookie。 你只需在視圖(view)中調用 request.session.set_test_cookie(),並在後續的視圖(view)、而不是當前的視圖(view)中檢查 request.session.test_cookie_worked() 。

雖然把 set_test_cookie() 和 test_cookie_worked() 分開的做法看起來有些笨拙,但由於cookie的工作方式,這無可避免。 當設定一個cookie時候,只能等瀏覽器下次訪問的時候,你才能知道瀏覽器是否接受cookie。

檢查cookie是否可以正常工作後,你得自己用 delete_test_cookie() 來清除它,這是個好習慣。 在你證實了測試cookie已工作了之後這樣操作。

這是個典型例子:

def login(request): # If we submitted the form... if request.method == 'POST':  # Check that the test cookie worked (we set it below):  if request.session.test_cookie_worked():   # The test cookie worked, so delete it.   request.session.delete_test_cookie()   # In practice, we'd need some logic to check username/password   # here, but since this is an example...   return HttpResponse("You're logged in.")  # The test cookie failed, so display an error message. If this  # were a real site, we'd want to display a friendlier message.  else:   return HttpResponse("Please enable cookies and try again.") # If we didn't post, send the test cookie along with the login form. request.session.set_test_cookie() return render_to_response('foo/login_form.html')

注意

再次強調,內建的認證函數會幫你做檢查的。

  • 聯繫我們

    該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

    如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

    A Free Trial That Lets You Build Big!

    Start building with 50+ products and up to 12 months usage for Elastic Compute Service

    • Sales Support

      1 on 1 presale consultation

    • After-Sales Support

      24/7 Technical Support 6 Free Tickets per Quarter Faster Response

    • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.