在网站中,HTTP请求是无状态的:第一次请求成功后,第二次请求时服务器依然不知道这次请求的所属用户是谁。为了解决这个问题,在第一次请求成功后,服务器会生成并返回对应的cookie信息给浏览器,而浏览器在下一次请求同一个网站的时候就会自动(不需要再输入用户名和密码了)将其cookie信息附在请求上,此时服务器根据请求中的cookie信息就知道用户是谁了。

cookie存储的数据量是有限的:虽然不同浏览器会有具体的大小限制,但是一般不会超过4KB(4KB已经算是很大了),因此cookie只能用来存储一些小数据。

cookie有效期:服务器返回cookie个浏览器时需要给cookie设置有效期,当请求中的cookie超过有效期后,此cookie就算作无效的了,如果不设置则有效期会在session结束时自动失效。

设置cookie:使用`from flask import Response`中Response的set_cookie方法

set_cookie(self, key, value='', max_age=None, expires=None, path='/', domain=None, secure=False, httponly=False, samesite=None):

  • key:cookie的key。
  • value:cookie的value。
  • max_age:设置cookie保存的时间(秒数),默认为None,表示保存时间与浏览器的session一致。
  • expires:设置cookie的有效期,应该传入Python中的`from datetime import datetime`数据类型,或者是一个时间戳。需要注意的是这个参数使用的是格林尼治时间,也就是说我们设置时间时需要在本地时间的基础上减8小时(北京时间与格林尼治时间相差8小时的时间差),在显示时才能显示为我们使用的正确时间,不然显示的时间总是比我们看到的时间多8小时。
  • path:设置使用cookie的url路径,默认为该域名下的url都有效。
  • domain:设置使用cookie的域名,默认为该请求下的域名,它的子域名是不能使用此cookie的,所以一般跨域名使用cookie时才会用到此参数。比如:主域名为“www.csdn.net”,如果想要子域名“xxx.csdn.net”也能使用此cookie,domain参数就需要设置为“.csdn.net”。
  • secure:此参数如果设置为True,则表示此cookie只能在HTTPS请求中才能使用。
  • httponly:此参数如果设置为True,则表示不允许JavaScript使用此cookie,注意,此设置可能不是所有的浏览器都支持。
  • samesite:限制cookie的使用范围,使其只能在“同一站点”才能使用此cookie。

注:如果同时设置了max_age和expires参数,则以max_age为准,会忽略expires参数。如果这两个参数多没有设置,则和浏览器的session保持一致,即关掉整个浏览器时,session自动结束,cookie也自动失效。

删除cookie:使用Response对象的delete_cookie方法删除对应key值的cookie即可,这个方法其他参数请参考set_cookie方法。

获取cookie:使用request.cookies.get方法即可获取对应的cookie信息。

简单示例:

from datetime import datetime

from flask import Flask, Response

from views import bp

app = Flask(__name__)
app.register_blueprint(bp)
# 主域名和子域名因为没有注册,所以需要在C:\Windows\System32\drivers\etc\hosts文件中配置一下
# 127.0.0.1 hai.com
# 127.0.0.1 hi.hai.com
app.config['SERVER_NAME'] = 'hai.com:5000' @app.route('/')
def hello_world():
resp = Response('Hello World! -- set cookie!')
# 有效期截止到2019-08-31 00:00:00
expire_time = datetime(year=2019, month=8, day=31, hour=16, minute=0, second=0)
# 有效期截止到31天之后
# expire_time = datetime.now() + timedelta(days=30, hours=16)
# expires参数使用的是格林尼治时间,比北京时间多8小时,所有想要显示为北京时间,需要在设置的时间上减8小时
# 同时设置了max_age和expires,则以max_age参数为准,会忽略expires参数。
# .hai.com表示以此为后缀的域名都可用此cookie
resp.set_cookie('username', 'xiaoming', max_age=60, expires=expire_time, domain='.hai.com')
return resp @app.route('/del_cookie/')
def del_cookie():
resp = Response('Hello World! -- delete cookie!')
# 删除cookie中对应key的信息
resp.delete_cookie('username')
return resp if __name__ == '__main__':
app.run(debug=True)

views.py文件:

from flask import Blueprint, request

# 新建蓝图对象,用于子域名的访问
bp = Blueprint('hi', __name__, subdomain='hi') @bp.route('/')
def index():
username = request.cookies.get('username')
return 'hi 首页: {}'.format(username)

Flask笔记:cookie的更多相关文章

  1. flask笔记(三)Flask 添加登陆验证装饰器报错,及解析

    Flask 添加登陆验证装饰器报错,及解析 写这个之前,是想到一个需求,这个是关于之前写Flask笔记(二)中的一个知识点,路由相关 需求为 : 有一些页面必须是登陆之后才能访问的,比如Shoppin ...

  2. [py]flask操作cookie&django的seesion和cookie机制

    浏览器同源策略(same-origin policy) csrf攻击防御核心点总结 django的cookie和session操作-7天免登录 flask操作cookie&django的see ...

  3. flask中cookie和session介绍

    flask中cookie和session介绍 一.cookie: 在网站中,http请求是无状态的.也就是说即使第一次和服务器连接后并且登录成功后,第二次请求服务器依然不能知道当前请求是哪个用户.co ...

  4. 笔记-cookie参数

    笔记-cookie参数 cookie各个参数详解 定义和用法 setcookie()函数向客户端发送一个 HTTP cookie. cookie是由服务器发送到浏览器的变量.cookie 通常是服务器 ...

  5. flask中cookie和session设置

    flask中cookie和session介绍   一.cookie: 在网站中,http请求是无状态的.也就是说即使第一次和服务器连接后并且登录成功后,第二次请求服务器依然不能知道当前请求是哪个用户. ...

  6. Flask笔记1

    Flask笔记 首先明确一下,要运行一个动态网页,我们需要 一个 Web 服务器来监听并响应请求,如果请求的是静态文件它就直接将其返回,如果是动态 url 它就将请求转交给 Web 应用. 一个 We ...

  7. 【Python】Flask系列-cookie和session笔记

    cookie: 1.cookie出现的原因:在网站中,http请求是无状态的.也就是说即使第一次和服务器连接后并且登录成功后,第二次请求服务器依然不能知道当前请求是哪个用户.cookie的出现就是为了 ...

  8. Python Flask,cookie,session ,设置、获取、删除

    使用Response类的set_cookie()方法可以设置cookie: Response.set_cookie( key, //键 value='', //值 max_age=None, //秒为 ...

  9. flask笔记二

    web表单 web表单是浏览者和网之间的一个互动平台,完成浏览器和服务器之间的数据交互. 1.用Flask-WTF来处理表单 (1)在根目录下编辑扩展配置--config.py CSRF_ENABLE ...

随机推荐

  1. Zuul 1.x 的工作原理

    Zuul简介 Zuul在微服务架构中,可以作为提供动态路由,监控,弹性,安全等边缘服务的框架.在Netflix,被用作所有请求到达streaming application的前门.Zuul使用一系列不 ...

  2. 并发—JVM内部机制和外部机制处理方法

    并发常见的编程场景,一句话概括就是,需要协调多个线程之间的协作,已保证程序按照自己原本的意愿执行.那么究竟应该如何协调多个线程? 这个问题比较宽泛,一般情况下,我们按照方式的纬度去简单区分,有以下两种 ...

  3. SSM框架之Mybatis(4)SqlMapConfig

    Mybatis(4)SqlMapConfig.xml SqlMapConfig.xml 中配置的内容和顺序 -properties (属性) --property -settings(全局配置参数) ...

  4. 用BAPI_ACC_DOCUMENT_POST过账生成凭证

    根据前台需要输入参数,在bapi里面传值,不同业务所需参数不同. dome1: "bapi结构赋值     LOOP AT lt_item INTO lw_item.       wa_do ...

  5. Shell命令-搜索文件或目录之which、find

    文件及内容处理 - which.find 1. which:查找二进制命令,按环境变量PATH路径查找 which命令的功能说明 which 命令用于查找文件.which 指令会在环境变量 $PATH ...

  6. java.sql.Date赋值给了java.util.Date.转化成JSONArray时出错net.sf.json.JSONException: java.lang.reflect.InvocationTargetException

    net.sf.json.JSONException: java.lang.reflect.InvocationTargetExceptionat net.sf.json.JSONObject.defa ...

  7. OpenStack I18N

    OpenStack I18N 官方文档: https://docs.openstack.org/oslo.i18n/latest/user/usage.html https://docs.openst ...

  8. Node.js中的模块接口module.exports

    在写node.js代码时,我们经常需要自己写模块(module).同时还需要在模块最后写好模块接口,声明这个模块对外暴露什么内容.实际上,node.js的模块接口有多种不同写法.在此做了个简单的总结. ...

  9. vue项目中常见问题及解决方案

    webpack项目中自动引入全局scss变量文件 假设我们有一个公共的scss变量文件variables.scss /*存放所有全局变量*/ $card-title:#C7D200; //首页 卡片标 ...

  10. ASP.NET开发实战——(六)ASP.NET MVC & 分层 代码篇

    上一篇文章对如何规范使用ASP.NET进行了介绍,本章内容将根据上一篇得出的结论来修改博客应用的代码. 代码分层 综合考虑将博客应用代码分为以下几个层次: ○ 模型:代表应用程序中的数据模型,与数据库 ...