Python 为每个响应设置Cookie

Python 为每个响应设置Cookie,python,session,cookies,flask,Python,Session,Cookies,Flask,我在应用程序中使用flask会话。在我的一个处理程序中,我设置了会话值,而在其他处理程序中没有设置会话。但我发现在每个响应中都有一个http头:setcookie存在。为什么会这样 app = Flask(__name__) app.secret_key = r"A0Zr98j/3yX R~XHH!jmN'LWX/,?RT" @app.route('/auth/login', methods=['POST']) @crossdomain(origin='*') def authlogin():

我在应用程序中使用flask会话。在我的一个处理程序中,我设置了会话值,而在其他处理程序中没有设置会话。但我发现在每个响应中都有一个http头:
setcookie
存在。为什么会这样

app = Flask(__name__)
app.secret_key = r"A0Zr98j/3yX R~XHH!jmN'LWX/,?RT"

@app.route('/auth/login', methods=['POST'])
@crossdomain(origin='*')
def authlogin():
    user = User(username=username, registered_at=sqlnow())
    user.accounts = [Account(provider='weibo', access_token=access_token, uid=uid)]
    account = user.accounts[0]

    session['user_id'] = account.user_id
    return jsonify({
        'status': 'success',
        'data': {
            'user_id': account.user_id,
            'uid': account.uid
        }
    })

@app.route('/api/movies/<movie_type>')
def moviescoming(movie_type):
    if movie_type == 'coming':
        return getmovies(MOVIE_TYPE_PLAYING, offset, limit)
    else:
        return getmovies(MOVIE_TYPE_COMING, offset, limit)

app.run(host='0.0.0.0', debug=True)
app=Flask(\uuuuu name\uuuuuu)
app.secret_key=r“A0Zr98j/3yX r~XHH!jmN'LWX/,?RT”
@app.route('/auth/login',methods=['POST'])
@跨域(原点=“*”)
def authlogin():
user=user(username=username,注册地址=sqlnow())
user.accounts=[Account(provider='weibo',access\u token=access\u token,uid=uid]
帐户=用户。帐户[0]
会话['user\u id']=account.user\u id
返回jsonify({
“状态”:“成功”,
“数据”:{
'user\u id':account.user\u id,
“uid”:account.uid
}
})
@app.route(“/api/movies/”)
def moviescoming(电影类型):
如果电影类型==“即将上映”:
返回getmovies(电影类型、播放、偏移、限制)
其他:
返回getmovies(电影类型、偏移量、限制)
app.run(host='0.0.0.0',debug=True)
代码如下所示:

简短的回答是: 这是出于设计,但最近对Flask的一项更改允许您通过使用
SESSION\u REFRESH\u EACH\u REQUEST
选项来更改此行为。截至发布此答案时,该选项尚未稳定发布

长话短说 让我们先回顾并讨论cookies的工作原理:

作为标准的Cookies 定义当代理(浏览器)声明会话已关闭时(通常在浏览器关闭时),除非提供了某种机制告知浏览器cookie何时实际过期:

除非cookie的属性另有指示,否则cookie[…] 在当前会话结束时过期(由用户定义 代理)

[……]

如果cookie既没有Max Age属性,也没有Expires属性,则 用户代理将保留cookie,直到“当前会话结束” (由用户代理定义)

如果服务器希望cookie在代理重新启动后继续存在,则需要设置过期时间。请注意,通常首选Expires属性,因为Internet Explorer具有

创建永久cookie 所以,不可能说饼干应该是“永久的”。当人们谈论“永久性”cookie时,他们真正谈论的是一个在浏览器重启后仍然存在的cookie。我知道有两种策略可以创建此“永久”cookie:

  • 将cookie的过期时间设置为足以被视为永久的时间(例如9999年)
  • 将cookie的过期时间设置为将来相对较新的时间(例如31天),但每次使用cookie时,都会再次更新过期时间。例如,在1月1日,我们将cookie设置为2月1日到期,但当用户在1月2日使用cookie时,我们将更新cookie(通过使用
    设置cookie
    )使其在2月2日到期
第一种方法要求仅将
Set Cookie
头设置到客户端一次(除非Cookie内容需要更改)

第二种方法需要在每次更新时发送
Set Cookie
头,以便在用户继续使用服务时不断“推”过期。请注意,它也不是真正的“永久”,因为超过31天不使用您的站点的用户的cookie将过期

RFC 6265确实有一些话要说:

尽管服务器可以将cookie的过期日期设置为
在遥远的将来,大多数用户代理实际上不会为
几十年。而不是选择免费的长期过期
在此期间,服务器应通过选择合理的 基于cookie用途的cookie过期期限。对于
例如,典型的会话标识符可以合理地设置为
两周后到期

因此,虽然它没有明确说明是否要不断更新到期日期,但它似乎说使用一个遥远的未来日期不应该被视为一种好的做法

Flask实施“永久cookie” Flask通过设计使用第二种方法(通过
设置cookie
不断更新cookie过期时间)。默认情况下,cookie的过期时间为未来31天(可通过配置)。对于每个请求,Flask都将使用另一个
Set Cookie
将过期时间再推31天(或您设置的永久会话生存期值)。因此,即使会话没有更改,您看到的每个请求都会出现
设置Cookie

然而,最近,在一个论坛上有一个讨论。这导致了一个允许用户更改其工作方式的错误。Flask将继续工作,但用户可以将新的
会话\u刷新\u每个\u请求
选项设置为False,这将导致仅在Cookie更改时发送
设置Cookie

新项目记录如下:

此标志控制永久会话的刷新方式[sic]。如果设置为
True
(这是默认值),然后每次刷新cookie 自动延长生存期的请求。如果设置为
False
a
set cookie
只有在修改会话时才会发送头。不 常设会议不受此影响

此新选项与现有的
永久性\u会话\u生存期
,使Flask开发人员能够更好地精确调整其“永久性”cookie的过期设置

截至此答案的发布日期(2013年12月24日),
会话\u刷新\u每个请求
选项尚未成为任何烧瓶版本的一部分,因此希望使用它的用户需要等待未来的烧瓶版本。

这会很好