Cách sử dụng phiên trong mẫu Django

Như đã thảo luận trước đó, chúng tôi có thể sử dụng cookie phía máy khách để lưu trữ nhiều dữ liệu hữu ích cho ứng dụng web. Chúng tôi đã thấy trước đây rằng chúng tôi có thể sử dụng cookie phía máy khách để lưu trữ nhiều dữ liệu hữu ích cho ứng dụng web của chúng tôi. Điều này dẫn đến rất nhiều lỗ hổng bảo mật tùy thuộc vào mức độ quan trọng của dữ liệu bạn muốn lưu

Vì lý do bảo mật, Django có khung phiên để xử lý cookie. Các phiên được sử dụng để tóm tắt việc nhận và gửi cookie, dữ liệu được lưu ở phía máy chủ [như trong cơ sở dữ liệu] và cookie phía máy khách chỉ có ID phiên để nhận dạng. Các phiên cũng hữu ích để tránh trường hợp trình duyệt người dùng được đặt thành 'không chấp nhận' cookie

Thiết lập phiên

Trong Django, việc bật phiên được thực hiện trong cài đặt dự án của bạn. py, bằng cách thêm một số dòng vào tùy chọn MIDDLEWARE_CLASSES và INSTALLED_APPS. Điều này nên được thực hiện trong khi tạo dự án, nhưng bạn nên biết rằng MIDDLEWARE_CLASSES nên có -

'django.contrib.sessions.middleware.SessionMiddleware'

Và INSTALLED_APPS nên có -

'django.contrib.sessions'

Theo mặc định, Django lưu thông tin phiên trong cơ sở dữ liệu [bảng Django_session hoặc bộ sưu tập], nhưng bạn có thể định cấu hình công cụ để lưu trữ thông tin bằng các cách khác như. trong tệp hoặc trong bộ đệm

Khi phiên được bật, mọi yêu cầu [đối số đầu tiên của bất kỳ chế độ xem nào trong Django] đều có thuộc tính phiên [dict]

Hãy tạo một ví dụ đơn giản để xem cách tạo và lưu phiên. Chúng tôi đã xây dựng một hệ thống đăng nhập đơn giản trước đây [xem chương xử lý biểu mẫu Django và chương Xử lý cookie Django]. Hãy để chúng tôi lưu tên người dùng vào cookie để nếu chưa đăng xuất, khi truy cập trang đăng nhập của chúng tôi, bạn sẽ không thấy biểu mẫu đăng nhập. Về cơ bản, hãy làm cho hệ thống đăng nhập mà chúng ta đã sử dụng trong Django Cookies xử lý an toàn hơn, bằng cách lưu phía máy chủ cookie

Đối với điều này, trước tiên hãy thay đổi chế độ xem đăng nhập của chúng tôi để lưu tên người dùng của bạn phía máy chủ cookie -

def login[request]:
   username = 'not logged in'
   
   if request.method == 'POST':
      MyLoginForm = LoginForm[request.POST]
      
      if MyLoginForm.is_valid[]:
         username = MyLoginForm.cleaned_data['username']
         request.session['username'] = username
      else:
         MyLoginForm = LoginForm[]
			
   return render[request, 'loggedin.html', {"username" : username}

Sau đó, hãy để chúng tôi tạo chế độ xem formView cho biểu mẫu đăng nhập, nơi chúng tôi sẽ không hiển thị biểu mẫu nếu cookie được đặt -

def formView[request]:
   if request.session.has_key['username']:
      username = request.session['username']
      return render[request, 'loggedin.html', {"username" : username}]
   else:
      return render[request, 'login.html', {}]

Bây giờ chúng ta hãy thay đổi url. py để thay đổi url sao cho nó ghép nối với chế độ xem mới của chúng ta -

from django.conf.urls import patterns, url
from django.views.generic import TemplateView

urlpatterns = patterns['myapp.views',
   url[r'^connection/','formView', name = 'loginform'],
   url[r'^login/', 'login', name = 'login']]

Khi truy cập /myapp/connection, bạn sẽ thấy trang sau –

Và bạn sẽ được chuyển hướng đến trang sau -

Bây giờ nếu bạn cố truy cập lại /myapp/connection, bạn sẽ được chuyển hướng trực tiếp đến màn hình thứ hai

Hãy tạo một chế độ xem đăng xuất đơn giản để xóa cookie của chúng tôi

def logout[request]:
   try:
      del request.session['username']
   except:
      pass
   return HttpResponse["You are logged out."]

Và ghép nó với một URL đăng xuất trong myapp/url. py

url[r'^logout/', 'logout', name = 'logout'],

Bây giờ, nếu bạn truy cập /myapp/logout, bạn sẽ nhận được trang sau -

Nếu bạn truy cập lại /myapp/connection, bạn sẽ nhận được form đăng nhập [màn hình 1]

Một số hành động có thể khác bằng cách sử dụng phiên

Chúng ta đã biết cách lưu trữ và truy cập phiên, nhưng thật tốt khi biết rằng thuộc tính phiên của yêu cầu có một số hành động hữu ích khác như -

  • set_expiry [giá trị] - Đặt thời gian hết hạn cho phiên

  • get_expiry_age[] − Trả về số giây cho đến khi phiên này hết hạn

  • get_expiry_date[] - Trả về ngày phiên này sẽ hết hạn

  • clear_expired[] - Xóa các phiên đã hết hạn khỏi kho lưu trữ phiên

  • get_expire_at_browser_close[] − Trả về Đúng hoặc Sai, tùy thuộc vào việc cookie phiên của người dùng đã hết hạn khi đóng trình duyệt web của người dùng

    Hướng dẫn này mở rộng trang web LocalLibrary của chúng tôi, thêm bộ đếm lượt truy cập dựa trên phiên vào trang chủ. Đây là một ví dụ tương đối đơn giản, nhưng nó cho thấy cách bạn có thể sử dụng khung phiên để cung cấp hành vi liên tục cho người dùng ẩn danh trong trang web của riêng bạn

    điều kiện tiên quyết. Hoàn thành tất cả các chủ đề hướng dẫn trước đó, bao gồm Hướng dẫn Django Phần 6. Danh sách chung và chế độ xem chi tiếtKhách quan. Để hiểu cách phiên được sử dụng

    Trang web LocalLibrary mà chúng tôi đã tạo trong các hướng dẫn trước cho phép người dùng duyệt sách và tác giả trong danh mục. Mặc dù nội dung được tạo động từ cơ sở dữ liệu, nhưng về cơ bản, mọi người dùng sẽ có quyền truy cập vào các trang và loại thông tin giống nhau khi họ sử dụng trang web

    Trong thư viện "thực", bạn có thể muốn cung cấp cho người dùng cá nhân trải nghiệm tùy chỉnh, dựa trên việc họ sử dụng trang web trước đây, tùy chọn, v.v. Ví dụ: bạn có thể ẩn thông báo cảnh báo mà người dùng đã xác nhận trước đó vào lần tới khi họ truy cập trang web hoặc lưu trữ và tôn trọng tùy chọn của họ [chẳng hạn như số lượng kết quả tìm kiếm mà họ muốn hiển thị trên mỗi trang]

    Khung phiên cho phép bạn triển khai loại hành vi này, cho phép bạn lưu trữ và truy xuất dữ liệu tùy ý trên cơ sở từng khách truy cập trang web

    Tất cả giao tiếp giữa trình duyệt web và máy chủ đều thông qua HTTP, không trạng thái. Thực tế là giao thức không trạng thái có nghĩa là các thông báo giữa máy khách và máy chủ hoàn toàn độc lập với nhau — không có khái niệm về "trình tự" hoặc hành vi dựa trên các thông báo trước đó. Do đó, nếu bạn muốn có một trang web theo dõi các mối quan hệ đang diễn ra với khách hàng, bạn cần phải tự triển khai điều đó

    Phiên là cơ chế được Django [và hầu hết Internet] sử dụng để theo dõi "trạng thái" giữa trang web và một trình duyệt cụ thể. Phiên cho phép bạn lưu trữ dữ liệu tùy ý trên mỗi trình duyệt và cung cấp dữ liệu này cho trang web bất cứ khi nào trình duyệt kết nối. Các mục dữ liệu riêng lẻ được liên kết với phiên sau đó được tham chiếu bằng một "khóa", được sử dụng để lưu trữ và truy xuất dữ liệu

    Django sử dụng cookie chứa id phiên đặc biệt để xác định từng trình duyệt và phiên được liên kết với trang web. Dữ liệu phiên thực tế được lưu trữ trong cơ sở dữ liệu trang web theo mặc định [điều này an toàn hơn lưu trữ dữ liệu trong cookie, nơi chúng dễ bị người dùng độc hại tấn công hơn]. Bạn có thể định cấu hình Django để lưu trữ dữ liệu phiên ở những nơi khác [bộ đệm, tệp, cookie "an toàn"], nhưng vị trí mặc định là một tùy chọn tốt và tương đối an toàn

    Các phiên được bật tự động khi chúng tôi tạo trang web khung [trong hướng dẫn 2]

    Cấu hình được thiết lập trong phần

    def login[request]:
       username = 'not logged in'
       
       if request.method == 'POST':
          MyLoginForm = LoginForm[request.POST]
          
          if MyLoginForm.is_valid[]:
             username = MyLoginForm.cleaned_data['username']
             request.session['username'] = username
          else:
             MyLoginForm = LoginForm[]
    			
       return render[request, 'loggedin.html', {"username" : username}
    
    4 và
    def login[request]:
       username = 'not logged in'
       
       if request.method == 'POST':
          MyLoginForm = LoginForm[request.POST]
          
          if MyLoginForm.is_valid[]:
             username = MyLoginForm.cleaned_data['username']
             request.session['username'] = username
          else:
             MyLoginForm = LoginForm[]
    			
       return render[request, 'loggedin.html', {"username" : username}
    
    5 của tệp dự án [locallibrary/locallibrary/settings. py], như hình bên dưới

    INSTALLED_APPS = [
        # …
        'django.contrib.sessions',
        # …
    
    MIDDLEWARE = [
        # …
        'django.contrib.sessions.middleware.SessionMiddleware',
        # …
    

    Bạn có thể truy cập thuộc tính

    def login[request]:
       username = 'not logged in'
       
       if request.method == 'POST':
          MyLoginForm = LoginForm[request.POST]
          
          if MyLoginForm.is_valid[]:
             username = MyLoginForm.cleaned_data['username']
             request.session['username'] = username
          else:
             MyLoginForm = LoginForm[]
    			
       return render[request, 'loggedin.html', {"username" : username}
    
    6 trong chế độ xem từ tham số
    def login[request]:
       username = 'not logged in'
       
       if request.method == 'POST':
          MyLoginForm = LoginForm[request.POST]
          
          if MyLoginForm.is_valid[]:
             username = MyLoginForm.cleaned_data['username']
             request.session['username'] = username
          else:
             MyLoginForm = LoginForm[]
    			
       return render[request, 'loggedin.html', {"username" : username}
    
    7 [một
    # Get a session value by its key [e.g. 'my_car'], raising a KeyError if the key is not present
    my_car = request.session['my_car']
    
    # Get a session value, setting a default if it is not present ['mini']
    my_car = request.session.get['my_car', 'mini']
    
    # Set a session value
    request.session['my_car'] = 'mini'
    
    # Delete a session value
    del request.session['my_car']
    
    0 được chuyển vào làm đối số đầu tiên cho chế độ xem]. Thuộc tính phiên này biểu thị kết nối cụ thể với người dùng hiện tại [hay chính xác hơn là kết nối với trình duyệt hiện tại, như được xác định bởi id phiên trong cookie của trình duyệt cho trang web này]

    Thuộc tính

    def login[request]:
       username = 'not logged in'
       
       if request.method == 'POST':
          MyLoginForm = LoginForm[request.POST]
          
          if MyLoginForm.is_valid[]:
             username = MyLoginForm.cleaned_data['username']
             request.session['username'] = username
          else:
             MyLoginForm = LoginForm[]
    			
       return render[request, 'loggedin.html', {"username" : username}
    
    6 là một đối tượng giống như từ điển mà bạn có thể đọc và viết bao nhiêu lần tùy thích trong chế độ xem của mình, sửa đổi nó theo ý muốn. Bạn có thể thực hiện tất cả các thao tác từ điển thông thường, bao gồm xóa tất cả dữ liệu, kiểm tra xem có khóa hay không, lặp qua dữ liệu, v.v. Tuy nhiên, hầu hết thời gian, bạn sẽ chỉ sử dụng API "từ điển" tiêu chuẩn để nhận và đặt giá trị

    Các đoạn mã bên dưới cho biết cách bạn có thể lấy, đặt và xóa một số dữ liệu bằng khóa "

    # Get a session value by its key [e.g. 'my_car'], raising a KeyError if the key is not present
    my_car = request.session['my_car']
    
    # Get a session value, setting a default if it is not present ['mini']
    my_car = request.session.get['my_car', 'mini']
    
    # Set a session value
    request.session['my_car'] = 'mini'
    
    # Delete a session value
    del request.session['my_car']
    
    2", được liên kết với phiên hiện tại [trình duyệt]

    Ghi chú. Một trong những điều tuyệt vời về Django là bạn không cần phải suy nghĩ về các cơ chế liên kết phiên với yêu cầu hiện tại của bạn trong chế độ xem của bạn. Nếu chúng tôi sử dụng các đoạn bên dưới theo quan điểm của mình, chúng tôi sẽ biết rằng thông tin về

    # Get a session value by its key [e.g. 'my_car'], raising a KeyError if the key is not present
    my_car = request.session['my_car']
    
    # Get a session value, setting a default if it is not present ['mini']
    my_car = request.session.get['my_car', 'mini']
    
    # Set a session value
    request.session['my_car'] = 'mini'
    
    # Delete a session value
    del request.session['my_car']
    
    2 chỉ được liên kết với trình duyệt đã gửi yêu cầu hiện tại

    ________số 8

    API cũng cung cấp một số phương pháp khác chủ yếu được sử dụng để quản lý cookie phiên được liên kết. Ví dụ: có các phương pháp để kiểm tra xem cookie có được hỗ trợ trong trình duyệt máy khách hay không, để đặt và kiểm tra ngày hết hạn của cookie cũng như xóa các phiên đã hết hạn khỏi kho lưu trữ dữ liệu. Bạn có thể tìm hiểu về API đầy đủ trong Cách sử dụng phiên [tài liệu Django]

    Theo mặc định, Django chỉ lưu vào cơ sở dữ liệu phiên và gửi cookie phiên cho máy khách khi phiên đã được sửa đổi [chỉ định] hoặc bị xóa. Nếu bạn đang cập nhật một số dữ liệu bằng khóa phiên của nó như đã trình bày trong phần trước, thì bạn không cần phải lo lắng về điều này. Ví dụ

    'django.contrib.sessions'
    
    2

    Nếu bạn đang cập nhật một số thông tin trong dữ liệu phiên, thì Django sẽ không nhận ra rằng bạn đã thực hiện thay đổi đối với phiên và lưu dữ liệu [ví dụ: nếu bạn thay đổi dữ liệu "

    # Get a session value by its key [e.g. 'my_car'], raising a KeyError if the key is not present
    my_car = request.session['my_car']
    
    # Get a session value, setting a default if it is not present ['mini']
    my_car = request.session.get['my_car', 'mini']
    
    # Set a session value
    request.session['my_car'] = 'mini'
    
    # Delete a session value
    del request.session['my_car']
    
    4" bên trong dữ liệu "
    # Get a session value by its key [e.g. 'my_car'], raising a KeyError if the key is not present
    my_car = request.session['my_car']
    
    # Get a session value, setting a default if it is not present ['mini']
    my_car = request.session.get['my_car', 'mini']
    
    # Set a session value
    request.session['my_car'] = 'mini'
    
    # Delete a session value
    del request.session['my_car']
    
    2" của mình, . Trong trường hợp này, bạn sẽ cần đánh dấu rõ ràng phiên là đã được sửa đổi

    'django.contrib.sessions'
    
    5

    Ghi chú. Bạn có thể thay đổi hành vi để trang web sẽ cập nhật cơ sở dữ liệu/gửi cookie theo mọi yêu cầu bằng cách thêm

    # Get a session value by its key [e.g. 'my_car'], raising a KeyError if the key is not present
    my_car = request.session['my_car']
    
    # Get a session value, setting a default if it is not present ['mini']
    my_car = request.session.get['my_car', 'mini']
    
    # Set a session value
    request.session['my_car'] = 'mini'
    
    # Delete a session value
    del request.session['my_car']
    
    6 vào cài đặt dự án của bạn [locallibrary/locallibrary/settings. py]

    Như một ví dụ thực tế đơn giản, chúng tôi sẽ cập nhật thư viện của mình để cho người dùng hiện tại biết họ đã truy cập trang chủ LocalLibrary bao nhiêu lần

    Mở /locallibrary/catalog/views. py và thêm các dòng chứa

    # Get a session value by its key [e.g. 'my_car'], raising a KeyError if the key is not present
    my_car = request.session['my_car']
    
    # Get a session value, setting a default if it is not present ['mini']
    my_car = request.session.get['my_car', 'mini']
    
    # Set a session value
    request.session['my_car'] = 'mini'
    
    # Delete a session value
    del request.session['my_car']
    
    7 vào
    # Get a session value by its key [e.g. 'my_car'], raising a KeyError if the key is not present
    my_car = request.session['my_car']
    
    # Get a session value, setting a default if it is not present ['mini']
    my_car = request.session.get['my_car', 'mini']
    
    # Set a session value
    request.session['my_car'] = 'mini'
    
    # Delete a session value
    del request.session['my_car']
    
    8 [như hình bên dưới]

    'django.contrib.sessions'
    
    9

    Ở đây, trước tiên chúng tôi lấy giá trị của khóa phiên

    # Get a session value by its key [e.g. 'my_car'], raising a KeyError if the key is not present
    my_car = request.session['my_car']
    
    # Get a session value, setting a default if it is not present ['mini']
    my_car = request.session.get['my_car', 'mini']
    
    # Set a session value
    request.session['my_car'] = 'mini'
    
    # Delete a session value
    del request.session['my_car']
    
    9, đặt giá trị thành 0 nếu trước đó chưa được đặt. Mỗi khi nhận được yêu cầu, chúng tôi sẽ tăng giá trị và lưu trữ lại trong phiên [cho lần tiếp theo người dùng truy cập trang]. Biến
    # Get a session value by its key [e.g. 'my_car'], raising a KeyError if the key is not present
    my_car = request.session['my_car']
    
    # Get a session value, setting a default if it is not present ['mini']
    my_car = request.session.get['my_car', 'mini']
    
    # Set a session value
    request.session['my_car'] = 'mini'
    
    # Delete a session value
    del request.session['my_car']
    
    7 sau đó được chuyển đến mẫu trong biến ngữ cảnh của chúng tôi

    Ghi chú. Chúng tôi cũng có thể kiểm tra xem cookie có được hỗ trợ trong trình duyệt tại đây hay không [xem Cách sử dụng phiên để biết ví dụ] hoặc thiết kế giao diện người dùng của chúng tôi sao cho việc cookie có được hỗ trợ hay không không quan trọng

    Thêm dòng hiển thị ở cuối khối sau vào mẫu HTML chính của bạn [/locallibrary/catalog/templates/index. html] ở cuối phần "Nội dung động" để hiển thị biến ngữ cảnh

    # Get a session value by its key [e.g. 'my_car'], raising a KeyError if the key is not present
    my_car = request.session['my_car']
    
    # Get a session value, setting a default if it is not present ['mini']
    my_car = request.session.get['my_car', 'mini']
    
    # Set a session value
    request.session['my_car'] = 'mini'
    
    # Delete a session value
    del request.session['my_car']
    
    7

    def login[request]:
       username = 'not logged in'
       
       if request.method == 'POST':
          MyLoginForm = LoginForm[request.POST]
          
          if MyLoginForm.is_valid[]:
             username = MyLoginForm.cleaned_data['username']
             request.session['username'] = username
          else:
             MyLoginForm = LoginForm[]
    			
       return render[request, 'loggedin.html', {"username" : username}
    
    3

    Lưu ý rằng chúng tôi sử dụng thẻ mẫu tích hợp Django để thêm "s" khi trang đã được truy cập nhiều lần

    Lưu các thay đổi của bạn và khởi động lại máy chủ thử nghiệm. Mỗi khi bạn làm mới trang, số sẽ cập nhật

    Giờ đây, bạn đã biết việc sử dụng phiên để cải thiện tương tác của mình với người dùng ẩn danh dễ dàng như thế nào

    Trong các bài viết tiếp theo, chúng tôi sẽ giải thích về khung xác thực và ủy quyền [quyền], đồng thời chỉ cho bạn cách hỗ trợ tài khoản người dùng

    Làm cách nào để sử dụng phiên Django?

    Nếu bạn muốn sử dụng phiên dựa trên cơ sở dữ liệu, bạn cần phải thêm 'django. đóng góp. phiên' vào cài đặt INSTALLED_APPS của bạn . Khi bạn đã định cấu hình cài đặt của mình, hãy chạy quản lý. py di chuyển để cài đặt một bảng cơ sở dữ liệu lưu trữ dữ liệu phiên.

    Làm cách nào để đăng nhập bằng phiên trong Django?

    Để đăng nhập người dùng, sử dụng login[] . Nó nhận một đối tượng HttpRequest và một đối tượng Người dùng và lưu ID của người dùng trong phiên, sử dụng khung phiên của Django.

    Làm cách nào để lấy dữ liệu từ phiên ở Django?

    session_data. Django lưu trữ dữ liệu phiên ở định dạng được mã hóa. Để lấy dữ liệu thô, sử dụng phương thức get_decoded[] của đối tượng phiên .

    Làm cách nào để in tất cả dữ liệu phiên trong Django?

    phiên. mặt hàng[]. print['{} => {}'. định dạng [khóa, giá trị]] .

Chủ Đề