Flask开发(十六)Flask数据交互 Cookie的使用

内容纲要

本篇导读:

  • Cookie的基本概念
  • Cookie的基本使用
  • 设置Cookie的作用域

Cookie有时也称作Cookies,它现在经常被大家提到,那么到底什么是Cookies?它有什么作用呢?Cookie是一种能够让网站服务器把少量数据储存到客户端的硬盘或内存,或是从客户端的硬盘读取数据的一种技术。当你再次浏览某网站时,浏览器将存放于本地的用户身份信息递交给服务器,服务器就可以识别用户的身份了。

Cookie的基本概念

在网站中,http请求是呈无状态的。无状态是指协议对于事务处理没有记忆能力,打开一个服务器上的网页和你之前打开这个服务器上的网页之间没有任何联系,你的当前请求和上一次请求究竟是不是同一个用户发出的,服务器也无从得知。为了解决这一问题,就出现了Cookie技术。当用户访问服务器并成功登陆后,服务器向客户端返回一些数据(Cookie),客户端将服务器返回的Cookie数据保存在本地,当用户再次发访问服务器时,浏览器自动携带Cookie数据给服务器,服务器便知道访问者的身份信息了。单个Cookie数据大小一般规定不超过3KB。

Cookie的基本语法如下:

set_cookie(name,value,expire,path,domain,secure)

Cookie参数设置说明如下表:

Cookie参数设置表

参数必须描述
nameY规定Cookie名称
valueY规定Cookie名称
expireN规定Cookie有效期
pathN规定Cookie在当前Web下哪些目录有效
domainN规定Cookie作用的有效域名
secureN规定是否通过安全的HTTPS连接来传输Cookie

Cookie的基本使用

我们在Flask中自定义Cookie,实际上就是在相应的Response的Set-Cookie字段中增加自定义键值对。而获取Cookie,就是在请求Request中通过键获取其对应的值,所以,在工程中必须引入Request和Respones模块。

1.设置Cookie

设置Cookie主要有两种方法,一种是通过Respones对象设置,另一种是通过直接设置表单头来实现。

(1)通过Respones对象设置的代码如下:

from flask import Flask,request,Response

app = Flask(__name__)


@app.route('/')
def set_cookie():
    resp=Response('设置Cookie!')
    resp.set_cookie('username','zhangsan')
    return resp


if __name__ == '__main__':
    app.run()

效果如下:

(2)通过设置表单头来实现,实例代码如下:

from flask import Flask,request,Response

app = Flask(__name__)


@app.route('/')
def set_cookie():
    resp=Response('设置Cookie!')
    # resp.set_cookie('username','zhangsan')
    resp.headers['Set-Cookie'] = 'username=zhangsan;Max-Age=3600;Path=/'
    return resp

2.查看Cookie

查看已经设置好的Cookie,可以通过request.cookies.get来得到。

@app.route('/get_cookie')
def get_cookie():
    usename=request.cookies.get('username')
    return usename

效果如下:

3.删除Cookie

删除已经设置好的Cookie,可以通过delete_cookie()来完成。delete_cookie括号中对象为被删除的对象名,比如delete_cookie('username')。

@app.route('/del_cookie')
def delete_cookie():
    resp=Response('删除Cookie!')
    resp.delete_cookie('username')
    return resp

下面通过一个例子,进一步说明Cookie的上述操作。

from flask import Flask,request,Response

app = Flask(__name__)


@app.route('/')
def set_cookie():
    resp=Response('设置Cookie!')
    resp.set_cookie('username','zhangsan',max_age=7200)
    # resp.headers['Set-Cookie'] = 'username=zhangsan;Max-Age=3600;Path=/'
    return resp

@app.route('/get_cookie')
def get_cookie():
    if request.cookies.get('username'):
        username=request.cookies.get('username')
    else:
        username='Cookie不存在!'
    return username

@app.route('/del_cookie')
def delete_cookie():
    resp=Response('删除Cookie!')
    resp.delete_cookie('username')
    return resp


if __name__ == '__main__':
    app.run()

读者可以依次通过访问http://127.0.0.1:5000/ , http://127.0.0.1:5000/get_cookie  , http://127.0.0.1:5000/del_cookie , http://127.0.0.1:5000/get_cookie的次序依次进行验证。

设置Cookie的作用域

Cookie默认只能在主域名下使用,如果想在子域名下使用Cookie,该怎么办呢?我们要在子域名下调用主域名的Cookie,首先需要创建一个子域名,如何创建子域名?

新建blue_admin.py,文件内容如下:

from flask import Blueprint,request
bp=Blueprint('admin_bp',__name__,subdomain='admin')

def get_cookie():
    username=request.cookies.get('username')
    return username or '没有获取到name值'

接着修改域名重定向对应的host文件,找到C:\Windows\System32\drivers\etc的host文件,增加两条记录如下:

127.0.0.1 admin.baidu.com

127.0.0.1 baidu.com

host文件建议使用Notepad++等编辑器打开,比建议使用windows自带编辑器打开。

app.py文件内容如下:

from flask import Flask,request,Response
from blue_admin import bp
app = Flask(__name__)
app.register_blueprint(bp)
app.config['SEVER_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()

使用子域名时,需要在配置文件中配置SEVER_NAME,比如:app.config['SEVER_NAME'] = 'baidu.com:5000',在注册蓝图时,还需要添加一个名称为subdomain的参数。

阅读剩余
THE END