关于python:Flask-Cookie的使用

5次阅读

共计 2015 个字符,预计需要花费 6 分钟才能阅读完成。

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 公布

正文完
 0