Django - Cookies 处理
有时,根据 Web 应用程序的需求,您可能希望为每个站点访问者存储一些数据。请始终记住,cookies 是保存在客户端的,根据客户端浏览器的安全级别,设置 cookies 有时可能成功,有时可能失败。
为了说明在 Django 中处理 cookies,让我们使用之前创建的登录系统创建一个系统。该系统将保持您登录 X 分钟的时间,超过该时间后,您将被退出应用程序。
为此,您需要设置两个 cookies:last_connection 和 username。
首先,让我们修改登录视图以存储 username 和 last_connection cookies −
from django.template import RequestContext
def login(request):
username = "not logged in"
if request.method == "POST":
#获取提交的表单
MyLoginForm = LoginForm(request.POST)
if MyLoginForm.is_valid():
username = MyLoginForm.cleaned_data['username']
else:
MyLoginForm = LoginForm()
response = render_to_response(request, 'loggedin.html', {"username" : username},
context_instance = RequestContext(request))
response.set_cookie('last_connection', datetime.datetime.now())
response.set_cookie('username', datetime.datetime.now())
return response
如上视图所示,设置 cookie 是通过在 response(而非 request)上调用 set_cookie 方法完成的,请注意所有 cookies 值都以字符串形式返回。
现在让我们为登录表单创建一个 formView,如果 cookie 已设置且未超过 10 秒,则不显示表单 −
def formView(request):
if 'username' in request.COOKIES and 'last_connection' in request.COOKIES:
username = request.COOKIES['username']
last_connection = request.COOKIES['last_connection']
last_connection_time = datetime.datetime.strptime(last_connection[:-7],
"%Y-%m-%d %H:%M:%S")
if (datetime.datetime.now() - last_connection_time).seconds < 10:
return render(request, 'loggedin.html', {"username" : username})
else:
return render(request, 'login.html', {})
else:
return render(request, 'login.html', {})
如上 formView 所示,访问您设置的 cookie 是通过 request 的 COOKIES 属性(dict)完成的。
现在让我们修改 url.py 文件以更改 URL,使其与新视图匹配 −
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'))
访问 /myapp/connection 时,您将看到以下页面 −
提交后,您将被重定向到以下屏幕 −
现在,如果您在 10 秒范围内再次访问 /myapp/connection,您将直接被重定向到第二个屏幕。如果超出此范围再次访问 /myapp/connection,您将看到登录表单(屏幕 1)。