http协议是无状态的。下一次去访问一个页面时并不知道上一次对这个页面做了什么。
无状态的应用层面的原因是:浏览器和服务器之间的通信都遵守HTTP协议。
根本原因是:浏览器与服务器是使用Socket套接字进行通信的,服务器将请求结果返回给浏览器之后,会关闭当前的套接字连接,而且服务器也会在处理页面完毕之后销毁页面对象。
有时需要保存下来用户浏览的状态,比如用户是否登录过,浏览过哪些商品等。实现状态保持主要有两种方式:
在客户端存储信息使用饼干。在服务器端存储信息使用Session.cookiecookie及其使用
def set_cookie(请求): ”““设置饼干信息”“” 响应=HttpResponse(“设置饼干”) #设置一个cookie信息,名字为num,值为1 响应。set_cookie (“num”, 1) #返回响应 返回响应
获取饼干
def get_cookie(请求): ”“”获取饼干信息”“” #取出饼干num的值 num=request.COOKIES (“num”) 返回HttpResponse (num)
设置饼干过期时间
def set_cookie(请求): ”““摄制饼信息”“” 响应=HttpResponse(“设置饼干”) #设置一个cookie信息,名字为num,值为1,并且设置饼干的过期时间为2周,两种方式 响应。set_cookie (“num”1 max_age=14 * 24 * 3600) #反应。set_cookie (“num”, 1=datetime.now到期()+ timedelta(天=14)) 返回响应
设置多个饼干
def set_cookie(请求): ”““摄制饼信息”“” 响应=HttpResponse(“设置饼干”) #设置多个饼干 响应。set_cookie (“num”, 1) 响应。set_cookie (num2, 2) 返回响应
编写login.html
& lt; !DOCTYPE html> & lt; html lang=癳n”比; & lt; head> & lt;元charset=皍tf - 8”比; & lt; title> Login & lt;元name=笆哟啊蹦谌?翱矶?设备宽度,初始=1”比; & lt;/head> & lt; body> & lt;形式行动="/login_check "方法=皃ost”比; & lt;标签="用户名"在用户: & lt;输入类型="文本" id="用户名" name="用户名" value=" https://www.yisu.com/zixun/{{usernam}}”在 & lt;/label> & lt; br/比; & lt;标签=懊苈搿痹诿苈? & lt;输入类型="密码" id="密码" name=懊苈搿北? & lt;/label> & lt; br/比; & lt;输入类型=案囱】颉泵?凹亲 弊4羌亲∮没? & lt; br/比; & lt;输入类型="提交" value=" https://www.yisu.com/zixun/登录”比; & lt;/form> & lt;/body> & lt;/html>
编写login_check函数
def login_check(请求): # 1。获取用户名和密码 用户名=request.POST.get(“用户”) 密码=request.POST.get(“密码”) 记得=request.POST.get(“记住”) 打印(用户名、密码) # 2。进行校验 # 3。返回应答 如果用户名====皔ifchan”和密码“yifchan”: 响应=重定向(“/指数”) #判断是否需要记住用户名 如果记得==吧稀? #设置饼干用户名——过期时间为1周 响应。set_cookie(用户名,用户名、max_age=7 * 24 * 3600) 返回响应 其他: 返回HttpResponse(“账号或密码错误”)
编写登录函数
def登录(请求): ”““登录处理函数”“ #获取饼干用户名 如果“用户名”request.COOKIES: 用户名=request.COOKIES(“用户”) 其他: 用户名=" 返回渲染(请求,“booktest/登录。html ", {“usernam”:用户名})Django中的饼干和会话