Django lưu trữ các đối tượng trong phiên như thế nào?

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. 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 đã thấy 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

    Sau khi tìm hiểu về Django Cookies trong bài viết trước, chúng ta sẽ chuyển sang tìm hiểu các phiên Django

    Như chúng ta đã thấy trong hướng dẫn trước, HTTP là một giao thức phi trạng thái, trong đó mọi yêu cầu được thực hiện luôn mới đối với máy chủ. Yêu cầu trên máy chủ luôn được xử lý như thể người dùng truy cập trang web lần đầu tiên. Điều này đặt ra một số vấn đề như bạn không thể triển khai các tính năng xác thực và đăng nhập người dùng. Những vấn đề này đã thực sự được giải quyết bằng Cookies

    Bây giờ, hãy xem xét lại khái niệm cookie một cách ngắn gọn và kiểm tra một số nhược điểm của nó

    Cookies là gì?

    Cookies là các tệp văn bản nhỏ được lưu trữ và duy trì bởi trình duyệt. Nó chứa một số thông tin về người dùng và mỗi khi có yêu cầu được gửi đến cùng một máy chủ, cookie sẽ được gửi đến máy chủ để máy chủ có thể phát hiện ra rằng người dùng đã truy cập trang web trước đó hoặc là người dùng đã đăng nhập

    Các cookie cũng có nhược điểm và nhiều khi chúng trở thành đường dẫn cho tin tặc và các trang web độc hại làm hỏng trang đích

    Hạn chế của Cookies

    Vì cookie lưu trữ cục bộ nên trình duyệt trao quyền kiểm soát cho người dùng để chấp nhận hoặc từ chối cookie. Nhiều trang web cũng cung cấp lời nhắc cho người dùng về cùng một

    Cookie là các tệp văn bản thuần túy và những cookie không được gửi qua HTTPS có thể dễ dàng bị kẻ tấn công bắt được. Do đó, có thể nguy hiểm cho cả trang web và người dùng khi lưu trữ dữ liệu cần thiết trong cookie và trả lại dữ liệu đó nhiều lần ở dạng văn bản thuần túy

    Đây là một số vấn đề phổ biến hơn mà các nhà phát triển web gặp phải liên quan đến cookie

    Luôn cập nhật các xu hướng công nghệ mới nhất
    Tham gia DataFlair trên Telegram.

    Phiên là gì?

    Sau khi quan sát những vấn đề này của cookie, các nhà phát triển web đã đưa ra một khái niệm mới và an toàn hơn, Phiên

    Phiên là giao tiếp bán cố định và hai chiều giữa máy chủ và trình duyệt

    Hãy hiểu chi tiết định nghĩa kỹ thuật này. Ở đây bán có nghĩa là phiên đó sẽ tồn tại cho đến khi người dùng đăng xuất hoặc đóng trình duyệt. Giao tiếp hai chiều có nghĩa là mỗi khi trình duyệt/máy khách đưa ra yêu cầu, máy chủ sẽ nhận được yêu cầu và cookie chứa các tham số cụ thể và ID phiên duy nhất mà máy chủ tạo để xác định người dùng. ID phiên không thay đổi đối với một phiên cụ thể, nhưng trang web tạo ra nó mỗi khi một phiên mới bắt đầu

    Nói chung, Cookie phiên quan trọng chứa các ID phiên này sẽ bị xóa khi phiên kết thúc. Tuy nhiên, điều này sẽ không ảnh hưởng đến các cookie có thời gian hết hạn cố định

    Tạo và tạo các phiên một cách an toàn có thể là một nhiệm vụ khó khăn và bây giờ chúng ta sẽ xem xét việc triển khai tương tự của Django.

    Phiên Django

    Django xem xét tầm quan trọng của các phiên trên trang web và do đó cung cấp cho bạn phần mềm trung gian và ứng dụng sẵn có sẽ giúp bạn tạo các ID phiên này mà không gặp nhiều rắc rối

    django. đóng góp. phiên là một ứng dụng hoạt động trên phần mềm trung gian. SessionMiddleware và thuận tiện để làm việc

    phần mềm trung gian. SessionMiddleware chịu trách nhiệm tạo ID phiên duy nhất của bạn. Bạn cũng sẽ yêu cầu django. đóng góp. ứng dụng phiên, nếu bạn muốn lưu trữ các phiên của mình trên cơ sở dữ liệu

    Khi chúng tôi di chuyển ứng dụng, chúng tôi có thể thấy bảng django_session trong cơ sở dữ liệu

    django. đóng góp. ứng dụng phiên có trong danh sách INSTALLED_APPS trong cài đặt. tập tin py

    Để làm việc trên các phiên, bạn sẽ cần kiểm tra xem trình duyệt của mình có hỗ trợ cookie hay không

    Tất nhiên, bạn có thể vào phần cài đặt và kiểm tra nhanh điều đó, nhưng hãy tạo một số chức năng xem và URL để hiểu các khái niệm theo cách tốt hơn. Cuối cùng, bạn sẽ phải vào cài đặt trình duyệt nếu xảy ra sự cố

    Bạn có biết?

    Kiểm tra Cookies trên Trình duyệt

    Để thêm các chức năng xem trong chế độ xem của chúng tôi. tệp py, hãy nhập

    Mã số

    def cookie_session[request]:
        request.session.set_test_cookie[]
        return HttpResponse["

    dataflair

    "] def cookie_delete[request]: if request.session.test_cookie_worked[]: request.session.delete_test_cookie[] response = HttpResponse["dataflair
    cookie createed"] else: response = HttpResponse["Dataflair
    Your browser doesnot accept cookies"] return response

     

    Bây giờ, chúng ta sẽ tìm hiểu các phương thức được sử dụng trong đoạn mã trên

    set_test_cookie[]

    Chúng tôi sử dụng phương pháp này để tạo cookie thử nghiệm khi trình duyệt của bạn yêu cầu hoặc đưa ra yêu cầu cho trang web này

    test_cookie_worked[]

    Phương thức này trả về giá trị boolean là True sau khi trình duyệt chấp nhận cookie. Nếu không, nó sai

    xóa_test_cookie[]

    Phương pháp này xóa cookie thử nghiệm

    Bây giờ, thêm các url vào urlpatterns

    Mã số

    ________số 8

     

    Sau khi chạy mã này

    1. tìm kiếm testcookie/

    2. tìm kiếm xóacookie/

    Nếu bạn nhận được thông báo này, thì trình duyệt của bạn chấp nhận cookie;

    Nếu kết quả không giống với những hình ảnh trên thì hãy bật trình duyệt của bạn để chấp nhận cookie;

    Tạo và truy cập phiên Django

    Django cho phép bạn dễ dàng tạo các biến phiên và thao tác với chúng cho phù hợp

    Đối tượng yêu cầu trong Django có thuộc tính phiên, tạo, truy cập và chỉnh sửa các biến phiên. Thuộc tính này hoạt động giống như một từ điển, tôi. e. , bạn có thể xác định tên phiên là khóa và giá trị của chúng là giá trị

    Bước 1. Chúng tôi sẽ bắt đầu bằng cách chỉnh sửa quan điểm của chúng tôi. tập tin py. Thêm phần mã này

    Mã số

    def create_session[request]:
        request.session['name'] = 'username'
        request.session['password'] = 'password123'
        return HttpResponse["

    dataflair
    the session is set

    "] def access_session[request]: response = "

    Welcome to Sessions of dataflair


    " if request.session.get['name']: response += "Name : {0}
    ".format[request.session.get['name']] if request.session.get['password']: response += "Password : {0}
    ".format[request.session.get['password']] return HttpResponse[response] else: return redirect['create/']

     

    Bước 2. Thêm các url trong danh sách urlpatterns

    Mã số

    'django.contrib.sessions'
    
    0

     

    Phải tìm hiểu – Cách ánh xạ các mẫu URL với chức năng xem?

    Bước 3. Bây giờ hãy chạy mã này

    1. tìm kiếm quyền truy cập/

     

    2. tìm kiếm quyền truy cập/một lần nữa

    Trong cơ sở dữ liệu, bạn sẽ thấy khóa và dữ liệu có độ mã hóa cao

    Hiểu Mã

    Mã tuân theo python cơ bản, nhưng các biến chúng tôi đang sử dụng có một số mã python phức tạp đằng sau chúng

    Khi bạn yêu cầu quyền truy cập/ URL mà không chạy tạo/ yêu cầu, bạn sẽ tự động chuyển hướng đến tạo/ nếu bạn chưa tạo cookie nào trước đó

    Giờ đây, khi tạo/URL được gửi, SessionsMiddleware sẽ chạy và tạo một SessionID duy nhất được lưu trữ cục bộ trên trình duyệt dưới dạng cookie cho người dùng

    Cookie này hiện được gửi đến máy chủ mọi lúc cùng với yêu cầu và phiên. Ứng dụng thực hiện công việc khớp SessionID với một trong cơ sở dữ liệu. Nó cũng lưu trữ một số giá trị và biến mà chúng ta đã tạo trong hàm view create_session[]

    Đối tượng yêu cầu có thuộc tính phiên và khi máy chủ chạy mã đó, phần mềm trung gian phiên và ứng dụng phiên sẽ tự động hoạt động cùng nhau

    yêu cầu. phiên [] hoạt động như một cấu trúc dữ liệu từ điển python và do đó, bạn có thể lưu trữ các giá trị cùng với các khóa có tên có ý nghĩa của chúng

    Trong hàm access_session[], chúng tôi đã sử dụng get[] bên cạnh yêu cầu. phiên và chuyển giá trị của khóa

    Do đó, bạn có thể truy cập các phiên một cách dễ dàng

    Có nhiều phương thức liên kết với đối số phiên của đối tượng HttpRequest

    Xóa phiên Django

    Sau khi hoàn thành các phiên làm việc, bạn có thể xóa chúng khá dễ dàng

    Chỉ cần bao gồm chức năng xem này bên trong chế độ xem. tập tin py

    Mã số

    'django.contrib.sessions'
    
    1

     

    Mã này cũng tuân theo python thuần túy;

    Để xóa một phiên hoặc bất kỳ khóa cụ thể nào của phiên đó, chúng ta có thể sử dụng del

    'django.contrib.sessions'
    
    2

    Bây giờ, để chạy mã này, hãy thêm mã này vào urlpatterns

    'django.contrib.sessions'
    
    3

     

    Đầu ra sẽ trông như thế này và đừng lo lắng nếu cookie của bạn không bị xóa vì chúng tôi chỉ sử dụng phương pháp này để xóa dữ liệu của bạn trong cơ sở dữ liệu Django chứ không phải ID phiên và chính cookie

    Để xóa hoàn toàn các cookie liên quan đến phiên, chúng tôi sử dụng hàm flush[], mặc dù các phiên sẽ xóa khi đóng trình duyệt

     

    Định cấu hình Công cụ phiên

    Có nhiều cách để bạn có thể định cấu hình công cụ phiên. Đó là một quyết định quan trọng khi các tùy chọn lưu trữ có thể cung cấp cho bạn tốc độ và thời gian phản hồi tốt hơn

    Django cho phép bạn chọn giữa các tùy chọn này nhưng không giới hạn các lựa chọn của bạn. Nếu bạn muốn một phương pháp lưu trữ khác, bạn có thể tìm thấy nó trên các gói django. tổ chức

    1. Theo phiên được hỗ trợ bởi cơ sở dữ liệu

    Chúng tôi đã sử dụng phương pháp này cho đến bây giờ, vì chúng tôi có django. đóng góp. ứng dụng phiên bên trong danh sách INSTALLED_APPS của chúng tôi trong cài đặt. tập tin py

    Đây là cách triển khai tiêu chuẩn và bao gồm nhiều lỗ hổng bảo mật. Nó cũng cung cấp cho bạn rất nhiều tính năng để sử dụng chúng trực tiếp với các chức năng xem và mô hình trong khung Django

    2. Theo phiên được lưu trong bộ nhớ cache

    Nếu bạn muốn cải thiện hiệu suất của trang web, bạn có thể sử dụng các phiên dựa trên bộ nhớ cache. Có một số phương pháp mà bạn có thể thực hiện ở đây, chẳng hạn như thiết lập nhiều bộ đệm

    Với mục đích này, Django cung cấp cho bạn nhiều công cụ phiên hơn

    django. đóng góp. phiên. phụ trợ. bộ đệm

    Công cụ trên lưu trữ dữ liệu trực tiếp vào bộ đệm

    django. đóng góp. phiên. phụ trợ. cache_db

    Mặt khác, công cụ này được sử dụng khi bạn muốn dữ liệu phiên liên tục với máy chủ của mình bằng cách sử dụng bộ đệm ghi. Điều đó có nghĩa là mọi thứ được ghi vào bộ đệm cũng sẽ được ghi vào cơ sở dữ liệu

    Cả hai phương pháp đều cải thiện đáng kể hiệu suất của bạn, nhưng phương pháp đầu tiên nhanh hơn phương pháp thứ hai

    3. Theo phiên dựa trên tệp

    Khi bạn muốn lưu trữ dữ liệu phiên của mình trong một hệ thống dựa trên tệp, thì bạn có thể sử dụng công cụ này mà Django cung cấp

    django. đóng góp. phiên. phụ trợ. tập tin

    Bạn cũng sẽ cần kiểm tra xem máy chủ web của mình có quyền đọc/ghi thư mục mà bạn đang lưu giữ tệp phiên của mình hay không

    4. Theo phiên dựa trên cookie

    Chúng tôi không khuyến nghị điều này vì các phiên được tạo để không lưu trữ dữ liệu trong cookie ngay từ đầu, tuy nhiên, các nhà phát triển vẫn sử dụng nó theo nhu cầu của họ

    django. đóng góp, phiên. phụ trợ. đã ký_cookies

    Điều này cho phép dữ liệu phiên của bạn được lưu trữ với sự trợ giúp của công cụ ký mã hóa của Django và khóa bí mật

    Nó đặt ra tất cả các vấn đề về cookie, vấn đề chính là session_cookies được ký nhưng không được mã hóa;

    Ngoài ra, nó có vấn đề về hiệu suất vì kích thước cookie ảnh hưởng đến kích thước yêu cầu

    Tóm lược

    Django cung cấp một số cách rất trực quan để triển khai các phiên và cho phép bạn làm việc với chúng một cách dễ dàng

    Trong hướng dẫn này, chúng tôi đã đề cập đến các chủ đề này

    • Hạn chế của cookie
    • Khái niệm phiên
    • Django thực hiện các phiên như thế nào
    • Sử dụng phiên trong chế độ xem
    • Định cấu hình phiên

    Django đã cung cấp rất nhiều tùy chọn để làm cho dự án web trở nên năng động và phát triển nhanh chóng như bạn muốn

    Chúng tôi sẽ đề cập đến các chủ đề về bộ nhớ đệm và các khái niệm liên quan khác trong các bài viết trong tương lai vì chúng hoàn toàn là các chủ đề khác nhau

    Django lưu trữ dữ liệu trong bộ lưu trữ phiên như thế nào?

    Theo mặc định, Django lưu thông tin phiên trong cơ sở dữ liệu [bảng hoặc bộ sưu tập Django_session], 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].

    Django xử lý việc quản lý phiên như thế nào?

    Để thiết lập phiên trong Django, chúng tôi cần thêm hai thứ vào cài đặt của mình. py. .
    'django. đóng góp. phiên. phần mềm trung gian. SessionMiddleware' sang MIDDLEWARE
    'django. đóng góp. phiên' thành INSTALLED_APPS. Chạy quản lý python. py di chuyển để điền vào bảng

    Làm cách nào để xóa dữ liệu phiên trong Django?

    Xóa phiên Django . Đầu ra sẽ trông như thế này và đừng lo lắng nếu cookie của bạn không bị xóa vì chúng tôi chỉ sử dụng phương pháp này để xóa dữ liệu của bạn trong cơ sở dữ liệu Django chứ không phải ID phiên và chính cookie. use del. The output will look like this and don't worry if your cookie didn't delete because we use this method only to delete your data in the Django database and not the session ID and cookie itself.

Chủ Đề