在网站中,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. HTML常用标签一

    html文本格式化标签 在网页中,有时需要为文字设置粗体 .斜体 或下划线 效果,这是就需要用到HTML中的文本格式标签,是文字以特殊的方式显示 标签语义:突出重要性,比普通文字更重要 语义 标签 说 ...

  2. JavaScript:for循环中let与var变量的绑定

    碰到一道题: for(var i=0;i<2;i++){ setTimeout(function(){ console.log(i); },100) } //输出结果为:2 2 for(let ...

  3. vue快速复习手册

    1.基本使用 <!DOCTYPE html> <head> <meta charset="UTF-8"> <title>Vue的基本 ...

  4. arcgis api for javascript 学习(六) 地图打印

    1.本文应用arcgis api for javascript对发布的动态地图进行打印,打印的为PDF格式,打印出来如图: 2.需要特别注意的是:我们在运行代码前,需要打开PrintingTools, ...

  5. Android JS打开原生应用

    设置App通过网页JS,唤醒打开本地应用. 在AndroidManifest 中,在应用启动页配置下,添加android:exported="true",设置category 添加 ...

  6. Linux—运行yum报错:No module named yum

    产生原因:yum基于python写的,根据报错信息提示,是yum的python版本对应不上目前python环境的版本导致的.也就是说 有人升级或者卸载了python. 解决方式: # 查看yum版本 ...

  7. mysql从命令行执行sql语句

    mysql -u root -p -e "create database mydb;"

  8. 第七周第二次Scrum会议

    工作: 根据上个周对前端的布置学习,布置大家开发了相应的界面.(界面开发成果写在测试报告) 地点: 二餐二 会议照片: 忘记拍了... 核心问题: 如何编写统一风格的前端界面. 解决: 将相应资源打包 ...

  9. Appium自动化测试之微信h5元素识别和代码实战

    总会有人问微信的自动化测试怎么做.其实我不太明白,为啥你要对ta做自动化测试啊,除非你们公司产品是基于微信做的开发否则没必要.即使一个公众号我也觉得没必要做自动化测试,基本功能点下没问题就可以了,毕竟 ...

  10. 线程让步yield

    一.yield()的作用 yield()的作用是让步.它能让当前线程由“运行状态”进入到“就绪状态”,从而让其它具有相同优先级的等待线程获取执行权:但是,并不能保证在当前线程调用yield()之后,其 ...