Flask基础(10)-->http的无状态协议解决办法一(客户端cookie)
http的无状态协议
http是一种无状态协议,浏览器请求服务器时无状态的
什么是无状态?
无状态:指的是一次用户请求时,浏览器、服务器无法知道之前这个用户做过什么,每次请求都是一次新的请求。
无状态协议:
- 协议对于事务处理没有记忆能力
- 对于同一个url的请求没有上下文的关系
- 每次请求都是独立的,它的执行情况和结果与前面的请求和之后的请求是无直接联系的,它不会受前面的请求赢啊情况直接影响,也不会影响后面的请求应答情况。
- 服务器中没有保存客户端的状态,客户端必须每次带上自己的状态去请求服务器。
无状态原因:浏览器和服务器是通过socket套接字进行通信的,服务器将请求结果返回给浏览器之后,会关闭当前的socket连接,而且服务器也会在处理页面完毕之后销毁页面对象。
那么,有时候我们也需要保持用户的浏览状态,比如,用户是否登录过,浏览过哪些商品等。
举个例子说明一下什么是有状态和无状态:
怎么实现状态保持呢?
- 在客户端存储信息使用cookie
- 在服务器端存储信息使用session
cookie的交互流程
如何设置和获取cookie呢?
下面用代码简单演示一下:
from flask import Flask
from flask import make_response app = Flask(__name__) @app.route('/')
def demo1():
return 'demo1' @app.route("/login")
def login():
# 默认账号和密码都是正确的
response = make_response("hellow")
return response if __name__ == '__main__':
app.run(debug = True)
通过make_response(“响应体”)创建response响应对象. 然后返回.
与直接return “响应体” 是一样的.
但是这里我们需要用到response响应对象,去设置cookie,所以需要这样写.
设置cookie
from flask import Flask
from flask import make_response app = Flask(__name__) @app.route('/')
def demo1():
return 'demo1' @app.route("/login")
def login():
# 默认账号和密码都是正确的
response = make_response("hellow")
# 设置cookie
response.set_cookie("user_id","")
response.set_cookie("user_name","laowang")
return response if __name__ == '__main__':
app.run(debug = True)
访问login之后,如果此时我们再访问当前网站的任何url,浏览器都会通过request携带cookie,传递给服务器.
获取cookie
我们另外写一个视图函数来显示获取cookie
from flask import Flask
from flask import make_response
from flask import request app = Flask(__name__) @app.route('/')
def demo1():
return 'demo1' @app.route("/login")
def login():
# 默认账号和密码都是正确的
response = make_response("hellow")
# 设置cookie
response.set_cookie("user_id","")
response.set_cookie("user_name","laowang")
return response @app.route("/get_cookie")
def get_cookie():
"""获取cookie"""
user_id = request.cookies.get("user_id")
user_name = request.cookies.get("user_name")
return "user_id=%s>>>>>> user_name=%s"%(user_id,user_name) if __name__ == '__main__':
app.run(debug = True)
通过上面分别访问/login>>>>>>/>>>>>>/get_cookie可以看出,cookie已经能够被浏览器保存记录,并且可以在站内各个页面进行传递
cookie的过期时间和删除操作
cookie作为客户端保存的数据,相对来说不是十分安全,因为你登录浏览过一个网站之后,过一会也可能别人会用你的浏览器,这时候你保存的cookie可能就会被别人利用。
设置cookie的有效时长,超过这个时间,cookie自动销毁
@app.route("/login")
def login():
# 默认账号和密码都是正确的
response = make_response("hellow")
# 设置cookie
response.set_cookie("user_id","",max_age=3600) # 单位:秒
response.set_cookie("user_name","laowang",max_age=3600)
return response
退出登录之后,主动销毁cookie
@app.route('/logout')
def logout(): #销毁cookie
response = make_response("quit success")
response.delete_cookie("user_id")
response.delete_cookie("user_name")
return response
此时,其实我们发现cookie并没有删除,而是将过期时间=创建时间,即:max_age=0
这样的话,cookie就失去了它的功能作用。那么我们也认为cookie被删除了。
Flask基础(10)-->http的无状态协议解决办法一(客户端cookie)的更多相关文章
- Flask基础(11)-->http的无状态协议解决办法二(服务端session)
session的交互流程 Session 对于敏感.重要的信息,建议存在服务器端,不能存储在浏览器中,比如用户名,密码,余额,验证码等信息 在服务器端进行状态保持的方案就是Session Sessio ...
- HTTP协议是无状态协议,怎么理解?
Http是一个无状态协议,同一个会话的连续两个请求互相不了解,他们由最新实例化的环境进行解析,除了应用本身可能已经存储在全局对象中的全部信息外,该环境不保存与会话有关的不论什么信息. 自己的理解,在 ...
- HTTP协议是无状态协议,怎么理解
详见:http://blog.yemou.net/article/query/info/tytfjhfascvhzxcytp24 HTTP协议是无状态协议,怎么理解? 2010-02-23 09:4 ...
- 《图解HTTP》读书笔记(三:无状态协议/cookie管理状态)
HTTP是一种不保存状态,即无状态(stateless)协议.HTTP协议自身不对请求和响应之间的通信状态进行保存. ——HTTP/1.1虽然是无状态协议,但为了实现期望的保持状态功能,于是引入了Co ...
- http无状态协议,cookie和session详解(一)
1.HTTP无状态协议 首先看百度百科给出的定义: HTTP无状态协议,是指协议对于事务处理没有记忆能力.缺少状态意味着如果后续处理需要前面的信息,则它必须重传, 这样导致可能每次连接传送的数据量增大 ...
- HTTP无状态协议
http://baike.baidu.com/view/4551466.htm HTTP协议是无状态协议. 无状态是指协议对于事务处理没有记忆能力.缺少状态意味着如果后续处理需要前面的信息,则它必须重 ...
- HTTP无状态协议理解
TTP协议是无状态协议. 无状态是指协议对于事务处理没有记忆能力.缺少状态意味着如果后续处理需要前面的信息,则它必须重传,这样可能导致每次连接传送的数据量增大.另一方面,在服务器不需要先前信息时它的应 ...
- HTTP要点概述:五,HTTP的无状态性,持久连接,Cookie
一,HTTP的无状态性: HTTP 是一种不保存状态,无状态(stateless)协议.HTTP 协议自身不对请求和响应之间的通信状态进行保存.也就是说在 HTTP 这个级别,协议对于发送过的请求或响 ...
- Eclipse无提示的解决办法 和 内容辅助技巧
Eclipse无提示的解决办法 和 内容辅助技巧 一.若发现内容辅助失效没有提示 下面是解决办法,现贴出来与大家共享: 1.菜单window->Preferences->Jav ...
随机推荐
- 2019icpc南京网络赛_F_Greedy Sequence
题意 题意不明,队友告诉我对于每个\(i\),所在下标\(p[i]\),在\([p[i]-k,p[i]+k]\)中找到小于\(i\)的最大数\(x\),然后\(ans[i]=ans[x]+1\)即可. ...
- babel-loader与babel-core的版本对应关系
babel-loader 8.x对应babel-core 7.xbabel-loader 7.x对应babel-core 6.x如何解决1. 卸载旧的babel-corenpm un babel-co ...
- 数据结构C线性表现实
linearList.h #ifndef _INC_STDIO_8787 #define _INC_STDIO_8787 #include <stdio.h> #include <m ...
- Linux下手动安装MySQL5.7
1.下载tar包,这里使用wget从官网下载 https://dev.mysql.com/downloads/mysql/ 2.将mysql安装到/usr/local/mysql下 # 解压 tar ...
- redis 原理系列之--字符串存储的实现原理(1)
背景 redis功能强大,几乎已经成了现代大中型服务必备的缓存技术了. 除了十分给力的缓存功能,redis当做消息队列,数据库也有着不错的表现. 我们都知道,redis 有五种数据类型,string, ...
- 洛谷 P2341 【受欢迎的牛】
题库:洛谷 题号:2341 题目:受欢迎的牛 link:https://www.luogu.org/problemnew/show/P2341 思路:因为奶牛的爱慕关系具有传递性,所以每个环(强连通分 ...
- HDU - 3416-Marriage Match IV (最大流 + 最短路)
HDU - 3416:http://acm.hdu.edu.cn/showproblem.php?pid=3416 参考:https://www.cnblogs.com/kuangbin/archiv ...
- Leetcode 957.N天后的牢房
Leetcode 957.N天后的牢房 8间牢房排成一排,每间牢房不是有人住就是空着. 每天,无论牢房是被占用或空置,都会根据以下规则进行更改: 如果一间牢房的两个相邻的房间都被占用或都是空的,那么该 ...
- 杭电多校第九场 hdu6425 Rikka with Badminton 组合数学 思维
Rikka with Badminton Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 524288/524288 K (Java/O ...
- android日志搜集原理及方案比较
说明: 本文只讨论Log日志,而不是应用的埋点日志. Android 日志架构 用一张图来了解Android Log的架构: 这里涉及到三个进程: APP进程: 调用Log的接口打日志,最终通过soc ...