Django - Cookie 处理

  • 简述

    有时,您可能希望根据 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 Cookie 处理
    您将在提交时被重定向到以下屏幕 -
    Cookies 处理重定向页面
    现在,如果您尝试在 10 秒内再次访问 /myapp/connection,您将直接被重定向到第二个屏幕。如果您在此范围之外再次访问 /myapp/connection,您将获得登录表单(屏幕 1)。