![910c90188c234facf925de1bdf8e2bc3.png](https://i-blog.csdnimg.cn/blog_migrate/3765e23fe2022c10b24a78df4fa5c682.jpeg)
小伙伴们在上网时有没有遇到过这种情况:
不管是知乎、Bilibili还是淘宝,第一次登录时都需要完整的输入用户名和密码,但同一个浏览器下,第二次点开网页却能自动登录,也不问你是谁。
是不是突然发现确实有这么个问题?!
![6812bc0e4dd5cdfdec28d337fee1d2cf.png](https://i-blog.csdnimg.cn/blog_migrate/9f6e5cc98bcfab5a0e5aeef1cee27a8c.png)
虽然存在一定的安全隐患,但确实方便呀!
![bb0927aa81b0af81f104145ca4c78ac4.png](https://i-blog.csdnimg.cn/blog_migrate/a536f90b125e6b92a911fea10ec216e3.png)
每次都输密码谁受得了!!!
那么问题来了,是谁在悄悄记住我们的密码?莫非是服务器?!
![6c15ba469a4516aab666b8f0d0ff8366.png](https://i-blog.csdnimg.cn/blog_migrate/599b0cffb59bcf936514ff9bc2b680f4.png)
一、Cookie的基本概念
在网站中,HTTP请求是呈无序状态的,也就是说协议对于事务处理没有记忆能力,打开一个服务器上的网页和你之前打开这个服务器上的网页之间没有任何联系,你的当前请求和上一次请求究竟是不是同一个用户发出的,服务器也无从得知。这样就带来一个问题,每次点击网页都需要用户登录?!
不,为了解决这个问题,Cookie技术(也记作Cookies)诞生了。
Cookies是一种能够让网站服务器把少量数据存储到客户端硬盘或内存,或是从客户端的硬盘读取数据的一种技术。
当用户访问服务器并登录成功后,服务器向客户端返回一些数据(Cookie),客户端将服务器返回的Cookie数据保存在本地,当用户再次访问服务器时,浏览器自动携带Cookie数据给服务器,服务器便知道访问者的身份信息了。
Cookie的基本语法:
Set_cookie(name,value,expire,path,domain,secure)
其中:
l name:必需项,规定Cookie的名称
l value:必需项,规定Cookie的值
l expire:可选项,规定Cookie的有效期
l path:可选项,规定Cookie在当前Web下哪些目录有效
l domain:可选项,规定Cookie作用的有效域名
l secure:可选项,规定是否通过安全的HTTPS连接来传输Cookie
前两个参数必须设置。
二、Cookie的基本使用
在Flask中自定义Cookie,实际上就是在相应Response的Set-Cookie字段中增加自定的键值对。
而获取Cookie,就是在请求Request中通过键获取其对应的值。
所以必须引入Request和Response模块。
设置Cookie
设置Cookie主要有两种方法,一种是通过Response对象设置,另一种是通过直接设置表单头来实现。
先看第一种,通过Response对象设置,代码如下:
from flask import Flask,Response
app = Flask(__name__)
@app.route('/')
def set_cookie():
resp = Response("设置Cookie!")
resp.set_cookie("username", "zhangsan")
return resp
if __name__ == "__main__":
app.run(debug=True)
代码中先创建了一个Response对象resp,然后通过set_cookie进行设置,username为key(键),zhangsan为键的值,设置完毕后需要返回resp。
打开网址后结果如下:
![0e1ae3d73f19bb0e0e9c3206e3c186e8.png](https://i-blog.csdnimg.cn/blog_migrate/7fabbff861927c6fe6d705601b95ad56.png)
咦?没看到Cookie呀!!!
别急,这里介绍一种最基本的查看方法。
以Google浏览器为例,首先在127.0.0.1:5000这个URL前面单击网站信息图标:
![289b9750fe5b504427509c5c98b6dc2a.png](https://i-blog.csdnimg.cn/blog_migrate/d57b375f97552ee7f89bede146a1e39d.png)
然后单击Cookie图标,弹出下列对话窗口,再依次打开127.0.0.1|Cookie文件夹,就可以找到已经设置好的Cookie值了。
![9875c36fbbc8fa19c42b469c1f2909f7.png](https://i-blog.csdnimg.cn/blog_migrate/722595bb9ef7c7b7d10599b4432999f4.png)
现在看第二种,通过设置表单头来实现,代码如下:
from flask import Flask,Response
app = Flask(__name__)
@app.route('/')
def set_cookie():
resp = Response("设置Cookie!")
resp.headers["Set-Cookie"] = "username=zhangsan; Expires=Sun,8-Nov-2020 05:10:02 GMT; Max-Age=3600; Path=/"
return resp
if __name__ == "__main__":
app.run(debug=True)
查看Cookie结果:
![b9f6a49f6f0eab0b25ed93447c55a193.png](https://i-blog.csdnimg.cn/blog_migrate/985d2d992194de2bcee78b5e18b12558.png)
代码中通过resp.headers["Set-Cookie"]设定Cookie的值,包括Cookie名、Cookie值、失效日期(Expires)、有效时间(Max-Age)、作用范围(path)。如果想让Cookie存在一段时间就要为expires属性设置未来的一个过期时间。
但在上面代码中Expires属性已经被Max-Age属性所取代,Max-Age用秒来设置生存期(3600秒为1小时),去掉Max-Age后便能看到日期变为11月8日失效。
三、设置Cookie的作用域
Cookie默认只能在主域名下使用。
但在实际的浏览网页过程中不可能只看一个域名下的内容,还包含很多子域名,这种情况下怎么办呢?
很简单,先用蓝图创建一个子域名,再在子域名下调用主域名的Cookie。
新建blue_admin.py文件,代码如下:
from flask import Blueprint,request
bp = Blueprint("admin_bp", __name__, subdomain="admin")
@bp.route("/")
def get_cookie(): #获取Cookie
username = request.cookies.get("username")
return username or "没有获取到name值"
上面的代码用蓝图定义了一个子域名,再导入到主文件中。
然后修改app.py文件,使得Cookie在子域名有效:
from flask import Flask,Response
from blue_admin import bp
app = Flask(__name__)
app.register_blueprint(bp)
app.config['SERVER_NAME'] = 'baidu.com:5000'
@app.route('/')
def set_cookie():
resp = Response("设置Cookie!")
resp.set_cookie("username", "zhangsan", domain=".baidu.com")
return resp
if __name__ == "__main__":
app.run(debug=True)
使用子域名时,需要在配置文件中配置SERVER_NAME才能重新注册服务器域名,对应的在注册蓝图时也需要添加subdomain参数。
但到这里还没完,注册服务器域名还需要一个步骤,找到C:WindowsSystem32driversetc中的hosts文件,增加两条记录:
127.0.0.1 admin.baidu.com
127.0.0.1 baidu.com
Hosts文件建议用Notepad++编辑器打开,效果如图:
![0562cc0fc3e0bebbe2a91013a3a66dcc.png](https://i-blog.csdnimg.cn/blog_migrate/54e2cc2021094c8b0331081e192517bd.jpeg)
查看运行结果,输入主域名http://baidu.com:5000:
![858419d10adad1488cf3fd6fab682dfe.png](https://i-blog.csdnimg.cn/blog_migrate/d6964d598e4c4289b7de42455f8cef98.png)
输入子域名admin. http://baidu.com:5000:
![99d1f9415e2e85ba06d5fdc64f2efe0a.png](https://i-blog.csdnimg.cn/blog_migrate/8c6150fe7dead646a2e4e1805771b948.png)
再查看子域名Cookie:
![8a281b506d511918de07ad576bc9dd02.png](https://i-blog.csdnimg.cn/blog_migrate/159c48b116418af3567be13acf422af0.png)
成功!!作用域限定在了.http://baidu.com。
四
关于Cookie就介绍这么多,Cookie在实际应用中非常广泛,虽然这次的内容比较复杂,但还是希望小伙伴们掌握!
下一次,我们将说一说Session的使用。
你确定不关注我一波?!
![0a02f13e6af12cdf1a7e402ab010e6c3.png](https://i-blog.csdnimg.cn/blog_migrate/dfff0424d94b492a5dd773aa75518db3.jpeg)