扫码一下
查看教程更方便
有时,我们可能希望根据 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 ,系统会将我们重定向到登录之后的页面
当超过10秒之后,再次访问 /app/connection 就会显示登录界面