Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/flash/4.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
Cookies Flask Session()对象不是永久对象_Cookies_Flask_Session Cookies - Fatal编程技术网

Cookies Flask Session()对象不是永久对象

Cookies Flask Session()对象不是永久对象,cookies,flask,session-cookies,Cookies,Flask,Session Cookies,在我的FlaskAPI中,我试图使会话保持永久性,这样即使在浏览器关闭后,会话仍将存在。我的前端是用React编写的,并使用fetchapi发出请求。然而,在测试了我目前所拥有的东西之后,它似乎不起作用。我的代码(遗漏了一些不相关的数据库内容): 到目前为止,我可以看出会话确实在存储userID值。然后,我编写另一个路由,告诉我会话中是否存储了用户ID值,如下所示: @bp.route('/init', methods=('GET',)) def init(): userID = ses

在我的FlaskAPI中,我试图使会话保持永久性,这样即使在浏览器关闭后,会话仍将存在。我的前端是用React编写的,并使用fetchapi发出请求。然而,在测试了我目前所拥有的东西之后,它似乎不起作用。我的代码(遗漏了一些不相关的数据库内容):

到目前为止,我可以看出会话确实在存储userID值。然后,我编写另一个路由,告诉我会话中是否存储了用户ID值,如下所示:

@bp.route('/init', methods=('GET',))
def init():
    userID = session.get('userID') 
    if userID is None:
        res = {"signedIn": False}
    else:
        res = {"signedIn": True, "username": userID}
    return jsonify(res)

但是,每次我调用'/init',它都返回False,即使我以前已登录。我不知道为什么这里的课程不是永久性的。是因为我正在本地运行我机器上的客户端吗?我是否需要在Chrome浏览器的某个位置允许cookie?我使用Chrome查看为客户机存储的cookies,那里没有存储“会话”。我是否需要在前端添加一些额外的东西来存储cookie/会话,还是它们会自动存储?我是否误解了烧瓶会话的用法

经过大量研究,找出了为什么会话不起作用!Flask会话本质上是Cookie,我使用FetchAPI执行CORS操作。默认情况下,Fetch()不允许接收或发送cookie,必须进行配置才能使用Flask会话

在我的React.js客户端上,我通过为“凭据”设置“include”来实现这一点:

        fetch(url, {
            method: 'POST',
            mode: 'cors',
            body: JSON.stringify(loginObj),
            credentials: 'include',
            headers: {
                'Content-Type': 'application/json'
            }
        })
        .then(res => res.json())
        ...
由于这种配置,请求不被视为“简单请求”,客户机实际上会使用选项请求“预飞行”POST请求。这意味着在发送我的POST请求之前,将首先向我的Flask服务器发送一个测试服务器是否具有正确访问权限的选项请求

飞行前选项请求将测试来自服务器的响应是否具有包含“访问控制允许来源”、“访问控制允许凭据”和“访问控制允许标头”的正确标头。如果OPTIONS请求发送的测试失败,那么实际的POST请求将不会被发送,您将得到一个获取错误

然后,我在Flask服务器上相应地设置了头,如下所示:

@bp.route('/login', methods=('POST','OPTIONS'))
def login():
    if request.method == 'OPTIONS':
        resp = Response()
        resp.headers['Access-Control-Allow-Origin'] = clientUrl
        resp.headers['Access-Control-Allow-Credentials'] = 'true'
        resp.headers['Access-Control-Allow-Headers'] = "Content-Type"

        return resp
    else:

        '''
        use session for something  
        '''  

        res['actionSuccess'] = False
        js = json.dumps(res)

        resp = Response(js, status=200, mimetype='application/json')        
        resp.headers['Access-Control-Allow-Origin'] = clientUrl
        resp.headers['Access-Control-Allow-Credentials'] = 'true'
        resp.headers['Access-Control-Allow-Headers'] = "Content-Type"

        return resp
请注意,“访问控制允许凭据”设置为“true”,而不是Python布尔值true,因为客户端无法识别Python布尔值


这样,一个Flask会话对象应该存储在您的cookie中。

凭证:'include'
这对我很有用!我可以在开发者模式下看到cookie
@bp.route('/login', methods=('POST','OPTIONS'))
def login():
    if request.method == 'OPTIONS':
        resp = Response()
        resp.headers['Access-Control-Allow-Origin'] = clientUrl
        resp.headers['Access-Control-Allow-Credentials'] = 'true'
        resp.headers['Access-Control-Allow-Headers'] = "Content-Type"

        return resp
    else:

        '''
        use session for something  
        '''  

        res['actionSuccess'] = False
        js = json.dumps(res)

        resp = Response(js, status=200, mimetype='application/json')        
        resp.headers['Access-Control-Allow-Origin'] = clientUrl
        resp.headers['Access-Control-Allow-Credentials'] = 'true'
        resp.headers['Access-Control-Allow-Headers'] = "Content-Type"

        return resp