在对Angular App的请求之间,烧瓶会话无法持续

时间:2018-11-16 16:05:19

标签: python angular session flask

我有一个Angular应用,需要调用Flask服务器,该服务器使用会话在请求之间存储信息。

我还有一个较旧的JS应用程序,该应用程序使用XMLHttpRequest调用了同一台服务器,而我正在用新的Angular应用程序替换该服务器。

问题在于,当旧应用发出请求时,会话cookie可以按预期工作,但是现在使用角度应用却无法正常工作。

所有交互都通过localhost完成。可从localhost:5000访问Flask服务器,并从localhost:4200访问Angular应用。

旧应用正在执行以下请求:

var xhttp = new XMLHttpRequest();
xhttp.open("GET", "http://localhost:5000/api/getAll", true);
xhttp.withCredentials = true;
xhttp.send();

Angular应用程序的运行方式如下:

import { Injectable } from '@angular/core';
import { HttpClient, HttpHeaders, } from '@angular/common/http';
import { Observable } from 'rxjs';

const httpOptions = {
  withCredentials: true,
  headers: new HttpHeaders({ 
    'Content-Type': 'application/json',
    'charset': 'UTF-8',

    })
};


@Injectable()
export class ServerService {
  url = "http://localhost:5000/api/"

  constructor(private http:HttpClient) { }

  getAll(): Observable<string>{
    return this.http.get<string>(this.url + 'getAll', httpOptions);
  }

  login (username: string): Observable<string> {
    return this.http.post<string>(this.url + 'login', JSON.stringify({"username": username}), httpOptions)
  }

}

还有Flask服务器:

from flask import Flask, session, request, jsonify
from flask_cors import CORS
import os
import Person
import multiprocessing as mp
import json
import Insurance
import datetime
import Functions
import missingVal


app = Flask(__name__)
CORS(app, supports_credentials=True)

# set the secret key. keep this really secret:
# The value come from calling os.urandom(24)
# See https://stackoverflow.com/a/18709356/3729797 for more information
# app.secret_key = b'fL\xabV\x85\x11\x90\x81\x84\xe0\xa7\xf1\xc7\xd5\xf6\xec\x8f\xd1\xc0\xa4\xee)z\xf0'
app.config['SECRET_KEY'] = b'fL\xabV\x85\x11\x90\x81\x84\xe0\xa7\xf1\xc7\xd5\xf6\xec\x8f\xd1\xc0\xa4\xee)z\xf0'




@app.route('/api/getAll')
def getAll():
    response = jsonify()
    if 'username' in session:
        user = users[session['username']]
        # some more logic here
        response = jsonify({'username': session['username']})

    return response

# login and account creation    
@app.route('/api/login', methods=['POST'])
def login():
    response = jsonify()
    if users.get(request.json.get('username')) is not None:
        session['username'] = request.json.get('username')
        # some more logic here
        response = jsonify({'username': session['username']})

    response.headers.add('Access-Control-Allow-Methods',
                         'GET, POST, OPTIONS, PUT, PATCH, DELETE')
    response.headers.add('Access-Control-Allow-Headers',
                         "Origin, X-Requested-With, Content-Type, Accept, x-auth")
    return response


if __name__ == '__main__':
    # some more logic here
    app.run(host='localhost', threaded=True

问题在于,当我登录时,它将信息推送到会话中,而当我再次发出请求时,我会检查该信息是否在会话中,但不是。

我在StackOverflow上发现了很多其他相关问题:

  • this one与多次设置secret_key有关,这不是我的问题。
  • this one讨论了init中的静态配置与动态配置,但我认为这与我的问题无关吗?告诉我我是否错了。
  • this onethis other one遇到了麻烦,因为它们在cookie中的有效负载太大,看起来只允许4096字节或更小。但是我只在cookie中输入了几个字母的用户名,所以我不认为这是我的问题。
  • this one我认为与我的问题有关,因为它处理本地主机,但是事实证明,这是因为OP混合了127.0.0.1localhost上的请求,并且cookie分别处理显然是通过烧瓶。我对localhost提出了所有要求,因此与我无关。

我现在有点迷路,可能有些明显的东西我很想念,但无法弄清楚,任何建议都值得赞赏

1 个答案:

答案 0 :(得分:2)

我通过添加

使它正常工作
response.headers.add('Access-Control-Allow-Headers',
                         "Origin, X-Requested-With, Content-Type, Accept, x-auth")
在发回所有请求之前,先在Flask服务器中

例如

@app.route('/api/doSomething', methods=['POST'])
def doSomething():
    response = jsonify()
    if 'username' in session:
        # some logic here
        response = jsonify(someData)

    # here is the line I added
    response.headers.add('Access-Control-Allow-Headers',
                         "Origin, X-Requested-With, Content-Type, Accept, x-auth")
    return response

显然,在进行CORS时需要使用MDN上的一些有用信息