(对不起,我的英语不好)
所以,我正在研究一个简单的 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 问题提供一些帮助,因为我已经尝试了几乎所有可以在互联网上找到的东西。