领先的免费Web技术教程,涵盖HTML到ASP.NET

网站首页 > 知识剖析 正文

一文详解Python Flask模块设置Cookie和Session

nixiaole 2025-05-02 20:33:36 知识剖析 8 ℃

什么是Cookie?

浏览器和服务器之间的请求和响应,我们已经很熟悉了,这里我们把请求响应称为会话,像是浏览器和服务器在聊天,在会话。在一次会话结束后,浏览器与服务器之间的连接就会关闭。再次请求响应时需要建立新的连接,这就是意味着上次会话中发生的事情,本次会话是不知道的。

那怎么记住会话状态呢?这就用到了cookie,cookie实际上是一小段文本信息,在这段文本中记录了上次会话的一些状态,所谓状态也就是浏览器服务器交互过程中的一些数据,用我们刚才的例子,就是在cookie中记录了汉堡的数量。浏览器第1次访问服务器后,在服务器返回的响应中会将cookie传递给浏览器。浏览器以后再访问服务器时,会带着cookie向服务器发起请求,这样cookie就在浏览器和服务器之间相互传递,通过cookie就可以实现跟踪会话,保存状态了。

设置Cookie和获取Cookie

现在我们想在cookie中设置name是小冰这样信息,键值对的形式,怎么设置呢?可以通过response对象来设置,response并不陌生,服务器每次返回的响应都是一个response对象。response对象有一个方法set_cookie用来设置cookie,方法中有三个参数,第一个参数是键,第二个参数就是值,这里键是name,值就是小冰,还有第三个参数,为cookie的有效期,如果不设置这个参数,那么默认是浏览器关闭,cookie就会消失。

@app.route('/', methods=['GET'])
def home():
    return render_template('g_home.html')

@app.route('/login', methods=['GET'])
def login_page():
    # 在下方写你的代码:获取cookie并验证,如果是yes则重定向到首页
    auto_login = request.cookies.get('auto_login')
    if auto_login == 'yes':
        return redirect('/')

    return render_template('g_login.html')


@app.route('/login', methods=['POST'])
def login():
    email = request.form.get('email')
    password = request.form.get('password')

    if email or password is "":
        return render_template('g_login.html')

    response = redirect('/')
    # 在下方写你的代码:设置cookie,键为auto_login,值为yes
    response.set_cookie('auto_login', 'yes')

    return response

Session:开发过程配置信息

class DefaultConfig:

    DEBUG = True  

class DevelopmentConfig(DefaultConfig):

    SECRET_KEY = 'NPHjiklfM'

def createFlaskApp(config):

    app = Flask(__name__)

    app.config.from_object(config)

    app.config.from_envvar('CAT_CONFIG', silent=True)

    return app 

app = createFlaskApp(DevelopmentConfig)


@app.route('/')
def index():

    # print(app.config['SECRET_KEY'])
    # print(app.config['USERNAME'], app.config['PASSWORD'])
    return render_template('index.html')

Cookie的弊端

使用Cookie也可以保存用户登录信息,但是存在一些弊端,首先它保存在客户端,容易被窃取,其次使用明文传输,容易被拦截,最后Cookie还有大小限制,每个cookie大小不能超过4KB,否则会被截掉,那更好的办法就是使用Session

Session概念

Session是记录用户状态的一种方法,首先它是在服务器上存储信息,比较安全。当用户登录的时候,发送请求给服务器,服务器接收之后,会生成Session存储用户信息,并且这个Session也是会加密的,然后把Session的id返回给浏览器,这个id就像是Session的身份证,一个用户信息,就用一个id去标识。

Session验证

再登录的时候怎么验证用户是否登录过呢?其实很简单,在第一次登录成功后,返回给浏览器session的id了,它就像一把钥匙,等到下次再访问登录页的时候,就会把session_id放在请求头一起返回,那服务器接收之后,会根据session_id找到用户信息,如果存在,就返回首页index.html。

Flask中的Session

Flask已经给我们提供了session对象,只要使用from flask import session就可以导入这个对象了。

Session中存数据

导入session后,调用session对象,以键值的方式存储数据,比如session['user'] = 'xiaotong',键是user,值就是xiaotong ,这样就把用户名存储到session中了,存储的格式就是{'user':'xiaotong'},格式可以看做是字典。

其实,使用session 不仅可以记录用户登录状态,还可以记录一些实时的隐私数据,比如下面这个项目场景:在小小银行家的项目中,我们可以输入存储的金额,点击提交后,会显示成功存储多少元钱,那我们就可以把存款金额存到session中,然后点击查询余额的时候,就可以在session中取出金额,并展示。

先来完成第一步,点击存钱,发送POST请求,此时在session中存储金额,使用的方法是session['money'] =[money] ,然后服务器再把获取到的存款金额返回即可。

@app.route('/save', methods=['POST'])
def save():

    # 在下方写你的代码:设置session,保存用户存款金额
    money = int(request.form.get('money'))

    if 'money' not in session:
        session['money'] = [money]
    else:
        tmp_li = session['money']
        tmp_li.append(money)
        session['money'] = tmp_li

    return '成功存储了%s元' % money

Session中取数据

通过id找session这些繁琐的操作,session对象都已经帮我们做好了,直接使用session.get('user')就可以取出用户信息了,参数是session的键user,也可以使用session['user'],不过这2种方法是有区别,第一种方法,即使user不存在,也不会报错,第二种,如果user不存在,就会报错,所以建议大家使用第一种方法。

查询的结果,也有两种情况,一种是存在,即是xiaotong 另一种是不存在,就是None学完从session中取值的方法之后,我们就可以继续完成小小银行家的项目了。

分析一下流程,当点击查询余额时,会发送get请求,服务器在接收到请求之后,通过session.get('money') 方法,获取存款数据,并计算总金额,返回给浏览器即可。

@app.route('/query', methods=['GET'])
def query():
    # 在下方写你的代码:获取session,计算总金额
    count = sum(session.get('money'))

    return '余额:%s元' % count

Session加密

在flask项目中对session加密很重要,用app.secret_key = '123456' 的方式就是设置了秘钥,其中app,就是flask对象,值必须是字符串类型,这个密钥,可以帮助我们给session加密,并且还很重要,一旦使用了session,就必须设置秘钥,否色程序会报错。

相关推荐

Tags:

最近发表
标签列表