目录

Django - Cookies处理( Cookies Handling)

有时,您可能希望根据Web应用程序的要求在每个站点访问者的基础上存储一些数据。 请记住,cookie是保存在客户端的,并且根据您的客户端浏览器安全级别,设置cookie有时可能会工作,有时可能不会。

为了说明Django中的cookie处理,让我们使用之前创建的登录系统创建一个系统。 系统将让您保持登录X分钟的时间,超过该时间,您将退出应用程序。

为此,您需要设置两个cookie,last_connection和username。

首先,让我们更改我们的登录视图以存储我们的用户名和last_connection cookie -

from django.template import RequestContext
def login(request):
   username = "not logged in"
   if request.method == "POST":
      #Get the posted form
      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是通过响应而不是请求调用的set_cookie方法完成的,并且还要注意所有cookie值都以字符串形式返回。

现在让我们为登录表单创建一个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,是通过请求的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时,您将看到以下页面 -

Django Cookies处理

并且您将在提交时重定向到以下屏幕 -

Cookie处理重定向页面

现在,如果您尝试在10秒范围内再次访问/ myapp/connection,您将直接重定向到第二个屏幕。 如果您再次访问此范围内的/ myapp/connection,您将获得登录表单(屏幕1)。

↑回到顶部↑
WIKI教程 @2018