一日一技:前端与后端都是怎么读写 Cookies 的?

开发 前端
无论使用前端方式还是后端方式,你都可以通过在 Cookies 里面储存一些信息,来实现某些开关或者记录一些信息。

[[410252]]

大家应该看过一些网站,在第一次访问的时候,它会弹出一些小提示或者操作指导,类似于下图所示:

当我关闭了这个提示以后,接下来它都不会弹出来。当我关闭了浏览器再打开,它也不会再弹出来。但是,大家观察截图右上角,可以看到我并没有登录,那么网站是怎么“记住”了我关闭这个提示的呢?实际上是通过 Cookies 来记录的。当我点击X 关闭这个提示的时候,网站的JavaScript 会往 Cookies 里面写入一条标记。当我们每次打开这个网站新的页面的时候,它都会判断一下 Cookies 里面有没有这个标记。如果没有这个标记,就弹出提示。如果有这个标记,就不弹出。

Cookies 本质上是一个长字符串,里面使用分号隔开了很多项,每一项由 Key 和 Value 组成,叫做一个 Cookie。

要不要弹出提示的开关在这里

当我们要往 Cookies 里面添加一条 Cookie 有两种常用方式:使用 JavaScript 或者通过后端设置。

使用 JavaScript 读写 Cookies

读取当前所有的 Cookies,可以使用代码:

  1. document.cookie 

运行效果如下图所示:

需要注意的是,如果你要判断某个键值是不是在 Cookies 里面,那么你需要做字符串匹配。这不能像 Object 一样直接根据 Key 去找 Value 或者判断 Key 在不在里面。

要写入一条 Cookie,我们可以使用代码:

  1. document.cookie = 'key=value' 

例如:

这里我们使用document.cookie=新的值,看起来像是覆盖了整个 Cookies,但实际上并不是这样。如果你新增的 key 跟已有的相同,那么会覆盖原有的这一个 Cookie的值,不影响其他的 Cookie;如果你新增的 key 不在原来的 Cookies 里面,那么它将会被添加到末尾。

使用 FastAPI读写 Cookies

还有一种方式是在后端设置 Cookies,我们以 FastAPI 为例来进行演示:

首先是向浏览器写入 Cookies,使用的代码如下:

  1. from fastapi import FastAPI, Response 
  2.  
  3.  
  4. app = FastAPI() 
  5.  
  6. @app.get('/'
  7. def index(response: Response, name: str = ''): 
  8.     if not name
  9.         name = 'kingname' 
  10.     response.set_cookie('name'name
  11.     return {'success'True'msg''网站正常运行'

这段代码的关键是路由函数的第一个参数response: Response。它的值是一个Response对象。我们只需要调用这个对象的.set_cookie方法,就能把自定义的 Cookie 添加进去。需要注意的是,你不需要主动返回这个 response 对象。

运行效果如下图所示,分别演示了有URL参数和没有URL参数的情况。

没有 URL 参数

有 URL 参数

至于读取 Cookies 也非常简单,并且还可以根据 Key 指定要哪几项:

  1. from typing import Optional 
  2. from fastapi import FastAPI, Cookie 
  3.  
  4.  
  5. app = FastAPI() 
  6.  
  7. @app.get('/'
  8. def index(name: str = '', info: Optional[str] = Cookie(None)): 
  9.     if not name
  10.         name = 'kingname' 
  11.     msg = f'{name} 你好,你的 Cookies中的info字段的值是: {info}' 
  12.     return {'success'True'msg': msg} 

我们注意到参数中有一项叫做info,这个参数名字就对应了 Cookies 中某一项的 Key。只有这个 Key 存在,这个 info 参数才会有值,否则它就是 None。

运行效果如下图所示:

如果你想从 Cookies 中拿多项,那么你可以多写几个参数:

  1. @app.get('/'
  2. def index(name: str = '', info: Optional[str] = Cookie(None), is_new_user: Optional[bool] = Cookie(False)): 
  3.     if not name
  4.         name = 'kingname' 
  5.     msg = f'{name} 你好,你的 Cookies中的info字段的值是: {info}, 是新用户吗:{is_new_user}' 
  6.     return {'success'True'msg': msg} 

运行效果如下图所示:

总结

无论使用前端方式还是后端方式,你都可以通过在 Cookies 里面储存一些信息,来实现某些开关或者记录一些信息。

本文转载自微信公众号「未闻Code」,可以通过以下二维码关注。转载本文请联系未闻Code公众号。

 

责任编辑:武晓燕 来源: 未闻Code
相关推荐

2021-04-27 22:15:02

Selenium浏览器爬虫

2021-10-15 21:08:31

PandasExcel对象

2022-06-28 09:31:44

LinuxmacOS系统

2024-11-13 09:18:09

2021-04-05 14:47:55

Python多线程事件监控

2022-03-12 20:38:14

网页Python测试

2021-04-12 21:19:01

PythonMakefile项目

2021-03-18 23:28:45

Python反斜杠字符串

2023-10-28 12:14:35

爬虫JavaScriptObject

2021-09-13 20:38:47

Python链式调用

2024-07-30 08:16:18

Python代码工具

2021-03-12 21:19:15

Python链式调用

2021-04-19 23:29:44

MakefilemacOSLinux

2024-07-30 08:11:16

2021-07-27 21:32:57

Python 延迟调用

2024-11-11 00:38:13

Mypy静态类型

2024-07-19 18:23:17

2024-05-24 09:07:06

JSONprint字符串

2021-10-03 20:08:29

HTTP2Scrapy

2021-05-08 19:33:51

移除字符零宽
点赞
收藏

51CTO技术栈公众号