Django - Phiên
Như đã thảo luận trước đó, chúng ta 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. Trước đây, chúng tôi đã thấ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 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ó một 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 trên phía máy chủ (như trong cơ sở dữ liệu) và cookie phía máy khách chỉ có một 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 kích hoạt phiên được thực hiện trong dự án của bạn settings.py, bằng cách thêm một số dòng vào MIDDLEWARE_CLASSES và INSTALLED_APPScác tùy chọn. Đ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, vì vậyMIDDLEWARE_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 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ư: file hoặc trong cache.
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 mẫu đơ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 trong 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 của chúng tôi mà chúng tôi đã sử dụng trong xử lý Cookie Django an toàn hơn, bằng cách lưu cookie phía máy chủ.
Đố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 phía máy chủ cookie tên người dùng của chúng tôi -
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 dạng 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ờ hãy để chúng tôi thay đổi tệp url.py để thay đổi url để nó ghép nối với chế độ xem mới của chúng tôi -
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ố gắng 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("<strong>You are logged out.</strong>")
Và ghép nối 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 biểu mẫu đăng nhập (màn hình 1).
Một số hành động khả thi hơn sử dụng phiên
Chúng tôi đã biết cách lưu trữ và truy cập một 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 (value) - Đặ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 cửa hàng phiên.
get_expire_at_browser_close() - Trả về True hoặc False, tùy thuộc vào việc cookie phiên của người dùng đã hết hạn khi trình duyệt web của người dùng bị đóng.