如何在Python Flask中设置cookie?

时间:2017-10-10 07:37:38

标签: python cookies flask

通过这种方式,我想设置我的cookie。但它没有设定。

@app.route('/')
def index():
    res = flask.make_response()
    res.set_cookie("name", value="I am cookie")

当我打印res时,它显示<Response 0 bytes [200 OK]但未设置Cookie

3 个答案:

答案 0 :(得分:24)

您在设置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')

答案 1 :(得分:1)

如果您使用其他工具查看它(例如,在Firefox或Chrome中按F12表示开发人员工具)或在呈现的响应中使用一段JavaScript代码,则您设置的cookie将可见。

通过浏览器本身(JavaScript)或作为服务器的响应,浏览器上设置Cookie。

差异非常重要,因为即使cookie是由服务器设置的,也可能不会在浏览器上设置cookie(例如:cookie被完全禁用或丢弃的情况)。

因此,即使服务器可能告诉“我设置了cookie”,该cookie可能也不会出现在浏览器中。

为确保服务器已设置cookie,需要浏览器的后续请求(请求头中包含cookie)。

因此,即使Flask的响应( res 变量)提到设置了cookie,我们也只能确定它是由服务器设置的,但浏览器将无法对其进行确认

高级 另一个方面是关于Flask或任何其他API如何创建响应。由于有效载荷(html /模板代码)和标头(cookie)是同时设置的,因此有效载荷内的“代码”(html /模板代码)可能无法访问cookie。 因此,您可能无法设置Cookie并将其显示在响应中。

一个想法可能是(能够)首先设置cookie和THEN来呈现上下文和设置顺序很重要-这样html / template才能知道已经设置的值。但是即使在这种情况下,也只有服务器确认它已设置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

答案 2 :(得分:0)

此响应将在您的浏览器中设置cookie

def func():
    response = make_response( render_template() )
    response.set_cookie( "name", "value" )
    return response