📅  最后修改于: 2020-10-25 10:03:48             🧑  作者: Mango
有时,您可能希望根据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时,您将获得以下页面-
然后您将在提交时重定向到以下屏幕-
现在,如果您尝试在10秒的范围内再次访问/ myapp / connection,您将直接重定向到第二个屏幕。并且,如果您再次超出此范围访问/ myapp / connection,则会得到登录表单(屏幕1)。