Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/349.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在Python烧瓶中设置cookie?_Python_Cookies_Flask - Fatal编程技术网

如何在Python烧瓶中设置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

这样,我想设置我的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.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的人的参考——就像我的情况一样。这是文档。您的答案包含在公认的答案中