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 responseBâ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ố 8Sau 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
"] def access_session[request]: response = "
the session is setWelcome 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'
0Phả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'
1Mã 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'
2Bâ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ệuChú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ớ cacheNế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ệpKhi 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 cookieChú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ảngLà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.