Почему Flask не сохраняется сессий с VueJS `npm run serve`? - PullRequest
0 голосов
/ 09 февраля 2020

У меня есть простое приложение с Flask и Rest-Plus на бэкэнде и VueJS внешним интерфейсом, сгенерированным VueCLI 3.

Я пытаюсь настроить сеансы, используя Flask -Session, но переменные сеанса, сохраненные в одном запросе, недоступны в другом.

Я перепробовал множество вариантов, но все еще ничего не получил.

Вот мой vue.config.js:

module.exports = {
    devServer: {
        public: "localhost:8080",
        headers: {
            "Access-Control-Allow-Origin": "*",
            "Access-Control-Allow-Credentials": "true",
            "Access-Control-Allow-Headers": "Content-Type, Authorization, x-id, Content-Length, X-Requested-With",
            "Access-Control-Allow-Methods": "GET, POST, PUT, DELETE, OPTIONS"
        },
        proxy: {
            '/api*': {
                // Forward frontend dev server request for /api to django dev server
                target: 'http://localhost:5000/'
            }
        }
    }
}

В моем app.py я установил секретный ключ и cors:

app.secret_key = "super_secret"
CORS(app, automatic_options=True, support_credentials=True)

Также я добавил декораторы к моим обработчикам запросов:

@cross_origin(supports_credentials=True)
def get(self):

И все равно ничего. В / логин я установил session['aaa']=1 и в другом запросе я получил KeyError.

Я запускаю фронтенд через npm run serve и бэкэнд через flask run. Какие-либо предложения?

1 Ответ

0 голосов
/ 10 февраля 2020

Решено добавлением обратного прокси от flask. Я добавил его в свой app.py, чтобы он передавал все запросы во внешний интерфейс.

Если вы будете использовать это решение во время разработки, не забудьте удалить эту конечную точку перед развертыванием на рабочем сервере.

@app.route('/dev', methods=['GET'])
@app.route('/js/<path:dummy>', methods=['GET'])
def proxy(dummy=None):
    if request.method == 'GET':
        resp = requests.get(request.base_url.replace('5000', '8080'))
        excluded_headers = ['content-encoding', 'content-length', 'transfer-encoding', 'connection']
        headers = [(name, value) for (name, value) in resp.raw.headers.items() if name.lower() not in excluded_headers]
        response = Response(resp.content, resp.status_code, headers)
    return response
...