如何在Python烧瓶中设置cookie?
这样,我想设置我的cookie。但它没有成功如何在Python烧瓶中设置cookie?,python,cookies,flask,Python,Cookies,Flask,这样,我想设置我的cookie。但它没有成功 @app.route('/') def index(): res = flask.make_response() res.set_cookie("name", value="I am cookie") 当我打印res时,它会显示您在设置cookie后返回了响应 @app.route('/') def index(): resp = make_response(render_template(...)) resp.se
@app.route('/')
def index():
res = flask.make_response()
res.set_cookie("name", value="I am cookie")
当我打印
res
时,它会显示您在设置cookie后返回了响应
@app.route('/')
def index():
resp = make_response(render_template(...))
resp.set_cookie('somecookiename', 'I am cookie')
return resp
这样,cookie将在浏览器中生成,但您可以在下一个请求中获取此cookie
@app.route('/get-cookie/')
def get_cookie():
username = request.cookies.get('somecookiename')
如果您使用其他工具查看设置的cookie(例如:Firefox或Chrome中的开发者工具按F12键),或者在呈现的响应中使用JavaScript代码,则设置的cookie将可见
cookie是通过浏览器本身(JavaScript)或作为服务器的响应在浏览器上设置的
这种差异非常重要,因为即使cookie是由服务器设置的,也可能不会在浏览器上设置cookie(例如:cookie被完全禁用或丢弃的情况)
因此,即使服务器可能会告诉“我设置了cookie”,浏览器上也可能不存在cookie
为了确保服务器设置了cookie,需要来自浏览器的后续请求(cookie存在于请求的标题中)
因此,即使Flask的响应(res变量)会提到cookie已设置,我们也只能确保它是由服务器设置的,但不会从浏览器中确认
高级
另一个方面是关于Flask或任何其他API如何创建响应。由于有效负载(html/模板代码)和标头(cookie)是同时设置的,因此有效负载(html/模板代码)中的“代码”可能无法访问cookie。
因此,您可能无法设置cookie并在响应中显示它
一个想法可能是(能够)首先设置cookies,然后呈现重要的上下文和设置顺序,以便html/模板知道已经存在的设置值。但即使在这种情况下,也只是服务器确认它设置了cookie
解决方案
@app.route('/')
def index():
res = flask.make_response()
res.set_cookie("name", value="I am cookie")
# redirect to a page that display the cookie
resp.headers['location'] = url_for('showcookies')
return resp, 302
此响应将在浏览器中设置cookie
def func():
response = make_response( render_template() )
response.set_cookie( "name", "value" )
return response
您可能不知道Cookie实际上是如何工作的:您指示浏览器在一个请求中设置Cookie,在来自同一浏览器的下一个请求中设置Cookie。您的代码不足以测试这一点。我认为这样说并不完全公平:一旦服务器用cookie响应,就意味着响应肯定不是空的(0字节)。是的,数据在Set Cookie标头中,有效负载为零,但更详细的res(ponse)变量转储应该会详细说明这一点。@Alex请不要说a)这个问题已经将近3年了,b)在我的评论之后已经进行了实质性的编辑。@KlausD。我认为这个答案可能会成为来自其他堆栈(例如:PHP或Java)并尝试学习Flask的人的参考——就像我的情况一样。这是文档。您的答案包含在公认的答案中