Cookie也被称作Cookies,它是一种让网站的服务器端可以把少量数据存储在客户端的硬盘或内存中,而后续又可以从客户端中读取该数据的技术。
- 在网站中,http请求是呈无序状态的
- 无序状态是指协议对于事务处理没有记忆能力,同一个服务器上你新打开的网页和之前打开的网页之间没有任何联系,你的当前请求和上一次请求究竟是不是一个用户发出的,服务器也无从得知;
- 为了解决这一问题,就出现了Cookie技术
-
当用户访问服务器并登录成功后,服务器向客户端返回一些数据(Cookie);
客户端将服务器返回的Cookie数据保存在本地,当用户再次访问服务器时,浏览器自动携带Cookie数据给服务器,服务器便知道访问者的身份信息了;
值得注意的是,浏览器发送的是当前本地保存的所有作用在当前域且在有效期内的cookie;
也就是说由上一次访问当前网站某一板块时服务器发送的旧cookie如果未过期,在访问其他板块的新请求中也会被携带,一同发送出去。这就是为什么有些时候我们抓包获取到了cookie,但用它测试连接时却发现这个cookie可有可无;
单个Cookie数据大小一般规定不超过3KB。
设置cookie
- Cookie一般通过Response对象的
set_cookie()
方法来设置,其基本语法如下:
# 前两个参数必须设置,后续参数则为可选参数
set_cookie(key,value[,max_age,expires,path,domain,secure,httponly,samesite])
key(或name) 必需项,规定cookie的名称,字符串
value 必需项,规定cookie的内容,字符串
max_age 可选项,规定cookie的失效时间(单位:秒),
与expires同时设置时,其优先级更高
expires 可选项,规定cookie的有效期,使用具体日期
path 可选项,规定cookie在当前web下那些目录有效,
默认情况下为所有目录"/"有效
domain 可选项,规定cookie作用的有效域(如:127.0.0.1)或域名(如:baidu.com),
默认情况下只作用于设置该cookie的域
secure 可选项,规定cookie是否只能通过安全的HTTPS连接传输,默认关闭
httponly 可选项,规定cookie是否只能被HTTP连接访问,默认关闭
即是否拒绝JavaScript访问Cookie
samesite 可选项,规定cookie是否只能被附加在同一站点(客户端)的请求中
每添加一个cookie,就调用一次Response.set_cookie()方法,示例代码如下:
from flask import Flask,request,Response
app = Flask(__name__)
@app.route('/')
def set_cookie():
"""
实例化Response对象时可以传入三个参数:
data:需要生成响应的数据。
status:响应的状态码。
平时我们请求接口的时候,如果成功状态码是200,Flask中这个状态码可以修改,在反爬虫中用处很大。
如我将数据成功返回,而状态码是401,那么其他人爬虫的时候就不会爬这些数据。
headers:设置请求头。
"""
resp = Response("设置Cookie!")
# 前两个参数默认传给key和value
resp.set_cookie("username","zhangsan",path='/static')
resp.set_cookie("password","123456",max_age=3600)
# 将Response对象作为响应return
return resp
if __name__ == '__main__':
app.run(debug=True)
- 除此之外,我们也可以通过修改响应对象Response的表单头headers来设置cookie:
@app.route('/h')
def set_cookie_h():
resp = Response("设置Cookie!")
# 通过添加表头的键值对来实现cookie设置
# 第一项为key=value,需要同时设置这两个参数,后续项则用分号分隔
resp.headers['Set-Cookie'] = " testname = lisi; Expires = SUN,01-Nov-2021 05:10:12 GMT; Max-Age=3600; path=/ "
return resp
查看cookie
在响应报文中设置了Cookies后,客户端在向服务器端发送一次请求(如登录操作)后,浏览器便会获取并保存该域名对应的cookie,这时我们可以通过request.cookies方法来查看我们发送的请求报文中携带的cookie;
该方法返回的是一个字典对象,所以我们想要查看指定key的value,可以使用:request.cookies.get('<key>')或request.cookies['<key>']
@app.route('/g')
def get_cookie():
# 因为我们为key=username的cookie设置的工作目录为子一级的static,
# 所以工作在当前目录下的程序无法获取该cookie的value,返回为None
username=request.cookies.get('username')
# 这两个cookie都可以直接获取value
password=request.cookies.get('password')
testname=request.cookies.get('testname')
return password #---- 响应对象为:123456 ----
# return testname #---- 响应对象为:lisi ----
设置cookie作用域
Cookie默认只能在主域名下使用,如果想要在子域名(蓝图页面)下也能使用Cookie,我们需要在子域名下调用主域名的Cookie,设置子域名的方法见上文;
主域名文件下设置cookie:
from flask import Flask,Response
import admin
app = Flask(__name__)
# 配置`SERVER_NAME`,设置主域名
app.config['SERVER_NAME'] = 'example.com:5000'
# 注册蓝图,指定了subdomain
app.register_blueprint(admin.bp)
# @app.route('/index')
# def index():
# return '通过域名访问!'
@app.route('/')
def set_cookie():
resp = Response("设置Cookie!")
# domain设置为 .example.com 是允许 example.com 域名下的各子域名使用该cookie
resp.set_cookie("username", "zhangsan",domain='.example.com')
return resp
if __name__ == '__main__':
app.run(host='0.0.0.0',debug=True)
- 子域名文件下调用主域名的cookie:
from flask import Blueprint,request
bp = Blueprint('admin',__name__,subdomain='admin')
# @bp.route('/ad')
# def admin():
# return 'Admin Page'
@bp.route('/')
def get_cookie():
username = request.cookies.get('username')
# 如果前一个对象为None,则将后一个对象作为响应
return username or '没有获取到name值'
标签:__,resp,域名,cookie,设置,使用,Cookie From: https://www.cnblogs.com/believeadream/p/18151373