Django Cookie

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

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

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

下面让我们对login视图进行修改,添加两个cookie

def login(request):
    username = ""
    if request.method == "POST":
        # 获取使用 post 提交的表单
        MyLoginForm = LoginForm(request.POST)

        if MyLoginForm.is_valid():
            username = MyLoginForm.data['username']
    else:
        MyLoginForm = LoginForm()
    response = render(request, 'loggedin.html', {"username": username})

    response.set_cookie('last_connection', datetime.datetime.now())
    response.set_cookie('username', username)

    return response

从上面的视图中可以看出,设置 cookie 是在响应中调用set_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 是通过 request 的 COOKIES 属性 (dict) 完成的。

接下来就是稍微对 app/urls.py 中的 connection 路由进行一下改造

from django.views.generic import TemplateView, ListView

from . import views

urlpatterns = [
    path('hello/', views.hello),

    path('connection/', views.formView),
    path('login/', views.login, name='login')
]

然后重启服务,访问 /app/connection 会显示登录界面。登录之后,会显示正常登录的界面。如果10秒之内,我们再次访问 /app/connection ,系统会将我们重定向到登录之后的页面

Django cookie登录

当超过10秒之后,再次访问 /app/connection 就会显示登录界面

查看笔记

扫码一下
查看教程更方便