0

(对不起,我的英语不好)

所以,我正在研究一个简单的 Flask + Vue 应用程序并尝试制作一个身份验证系统。我使用这个烧瓶教程作为基础,其中包含身份验证功能。到目前为止,为了在 Flask 和 Vue 之间进行通信,我使用的是 axios 和 Flask-CORS。前端部分工作正常,但是,我在后端(烧瓶)中的登录功能无法保留我传递给它的数据。经过几天的研究,我认为我将问题跟踪到了 CORS,不允许会话对象中的数据在不同请求之间持续存在。

所以这里是代码的重要部分:

from flask import Flask, jsonify, session
from flask_cors import CORS
from api.db.config_db import init_app

def create_app(test_config=None):

    # create and configure the app
    app = Flask(__name__, instance_relative_config=True)
    app.config.from_object(__name__)
    app.config.from_mapping(
        DEBUG = True,
        SECRET_KEY='dev',
        SESSION_COOKIE_PATH ='/',
    )

    # enable CORS
    CORS(app, supports_credentials=True, resources={r'/*': {'origins': '*'}})

    # sanity check route
    @app.route('/ping', methods=['GET'])
    def ping_pong():
        return jsonify('pong!')

    # Register DB commands
    init_app(app)

    from . import auth
    app.register_blueprint(auth.bp)
    CORS(auth.bp)

    from . import users
    app.register_blueprint(users.bp)
    CORS(users.bp)

    return app

授权蓝图:

import functools

from flask import (
    Blueprint, g, jsonify, request, session
)
from flask_cors import CORS
from werkzeug.security import check_password_hash, generate_password_hash

from api.db.mongodb.users_db import find_all, find_by_email, find_one, set_host, insert_one

bp = Blueprint('auth', __name__, url_prefix='/auth')

@bp.route('/login', methods=('GET', 'POST'))
def login():
    response_object = {'status': 'success'}

    if request.method == 'POST':
        post_data = request.get_json()

        email = post_data.get('email')
        password = post_data.get('password')
        error = None

        user = find_by_email({"email": email})

        if user is None:
            response_object['message'] = 'Couldnt find email.'
            error = 'Couldnt find email.'
        if not check_password_hash(user['password'], password):
            response_object['message'] = 'Incorrect password.'
            error = 'Incorrect password.'

        if error is None:
            print("- What is in session before clear?")
            print(session)
            session.clear()

            session['user_email'] = user['email']
            session.modified = True
            session.permanent = True

            print("- Session new email: ", session['user_email'])

            print("- What is in the final session login?")
            print(session)

            response_object['message'] = 'User logged in!'
            #return jsonify(response_object)

            check_session()

    return jsonify(response_object)

def check_session():
    print("- Check function session")
    print(session)

@bp.before_app_request
def load_logged_in_user():
    print("- Initial before_app_request SESSION: ")
    print(session)
    user_email = session.get('user_email')

    if user_email is None:
        g.user = None
    else:
        g.user = find_by_email(user_email)

将请求传递给登录视图后,我的终端返回的内容:

- Initial before_app_request SESSION:  <SecureCookieSession {}>
127.0.0.1 - - [12/Feb/2022 03:45:57] "OPTIONS /auth/login HTTP/1.1" 200 -
- Initial before_app_request SESSION:  <SecureCookieSession {}>
- What is in session before clear? <SecureCookieSession {}>
- Session new email:  romario@gmail.com
- What is in the final session login? <SecureCookieSession {'user_email': 'romario@gmail.com', '_permanent': True}>
- Check function session <SecureCookieSession {'user_email': 'romario@gmail.com', '_permanent': True}>
127.0.0.1 - - [12/Feb/2022 03:45:58] "POST /auth/login HTTP/1.1" 200 -
- Initial before_app_request SESSION:  <SecureCookieSession {}>
127.0.0.1 - - [12/Feb/2022 03:45:58] "GET /users/all_users HTTP/1.1" 200 -

所以,我想我正在以正确的方式操作会话对象,我什至使用了 .modified 和 .permanent 对象来确保数据持续存在,但我无法使其与 before_app_request() 一起工作。

另外,我认为它不会影响我正在尝试做的事情,GET 请求来自不同的蓝图。我只是在同一个蓝图上尝试了 GET,问题是一样的。

我会在这里就如何解决这个明显的 CORS 问题提供一些帮助,因为我已经尝试了几乎所有可以在互联网上找到的东西。

4

0 回答 0