关于python:Flask-Cookie的使用

Flask – Cookie的应用

用户应用浏览器第一次拜访服务端时,服务端生成cookie,放在响应response里返回,并保留在用户浏览器里.

from flask import Flask,make_response
@app.route('/set/<name>')
def set_cookie(name):
    response = make_response(redirect(url_for('hello')))
  response.set_cookie('name',name) # set_cookie视图会在生成的响应报文首部中创立一个Set-Cookie字段,即"Set-Cookie: name=xxx;Path=/"
  return response

用户下次访问同一个服务端时,会在header里携带已保留的cookie.

from flask import Flask,request
@app.route('/')
@app.route('/hello')
def hello():
    name = request.args.get('name')  #如果查问参数里没有name值则从cookie获取
  if name is None:
    name = request.cookies.get('name','Human')  #从Cookie中获取name值
  return '<h1>Hello,%s</h1>' % name          

因为用户能够间接批改浏览器的cookie值,冒用别人账户,所以间接应用cookie是不平安的.

Flask提供了session对象用来将Cookie数据加密存储.(默认状况下,它会把数据存储在浏览器上一个名为session的cookie里)

app.secret_key = 'secret string' #设置密钥

更平安的做法是把密钥写进零碎环境变量(在命令行中应用export或set命令),或是保留在.env文件中

SECRET_KEY=secret string

而后在程序脚本中应用os模块提供的getenv()办法获取:

app.secret_key = os.getenv('SECRET_KEY','secret string') #第二个参数是作为没有获取到对应环境变量时应用的默认值`

#联合应用
@app.route('/login')
def login():
    session['logged_in'] = True 
    #写入session. 向session中增加一个名为logged_in的cookie,将它的值设为True.
    #应用session对象增加cookie时,数据会应用程序的密钥对其进行签名,加密后的数据存储在一块名为session的cookie里. 用户能够看到加密后的值,但无奈批改它,一旦数据被批改,签名的值也会变动,这样在读取时会验证失败,对应的session值也会随之生效.
    return redirect(url_for('hello'))
@app.route('/hello')
def hello():
    name = request.args.get('name')
    if name is None:
        name = request.cookies.get('name','Human')
        response = '<h1>Hello, %s!</h1>' % name
        
    #session中的数据能够像字典一样通过键读取,或是应用get()办法.
    if 'logged_in' in session:  #依据用户认证状态返回不同的内容.
        response += '[Authenticated]'
    else:
        response += '[Not Authenticated]'
    
    return response

登出用户的账户,实际操作其实就是把代表用户认证的logged_in cookie删除,通过session对象的pop办法实现.

from flask import session
@app.route('/logout')
def logout():
  if 'logged_in' in session:
    session.pop('logged_in')
  return redirect(url_for('hello'))

默认状况下,session cookie会在用户敞开浏览器时删除.

通过将session.permanent属性设置为True能够将session的有效期缩短为Flask.permanent_session_lifetime属性值对应的datetime.timedelta对象.

也能够通过配置变量PERMANENT_SESSION_LIFETIME设置,默认为31天.

只管session对象会对Cookie进行签名并加密,但这种形式仅可能确保session的内容不会被篡改,加密后的数据借助工具依然能够轻易读取(即时不晓得密钥),所以相对不能在session中存储用户明码等敏感信息.

本文由博客群发一文多发等经营工具平台 OpenWrite 公布

评论

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

这个站点使用 Akismet 来减少垃圾评论。了解你的评论数据如何被处理