python - 如何在flask-jwt-extended中获取当前用户(id)?

标签 python flask sqlalchemy flask-sqlalchemy flask-jwt-extended

我是 python/flask 的新手,我正在处理一对多的关系。我尝试了一些解决方案,但没有奏效。我的问题是在“/add_about”路由中,我想获取创建此帖子的 user_id 并能够看到反射(reflect)在数据库中的信息。

这是我的代码:

from flask import Blueprint, jsonify, request
from flask_jwt_extended import jwt_required, current_user, get_current_user, get_jwt_identity
from app import db
from models.about import About, AboutSchema
from models.users import User


about = Blueprint('about', __name__)

about_schema = AboutSchema()
abouts_schema = AboutSchema(many=True)


@about.route('/')
def hello():
    return "Oh LA LA LA LA !!!!!!"


# Get all abouts:
@about.route('/all', methods=['GET'])
def abouts():
    abouts_list = About.query.all()
    result = abouts_schema.dump(abouts_list)
    return jsonify(result)


@about.route('/add_about', methods=['POST'])
@jwt_required
def add_about():
    description = request.form['description']
    user_id = get_jwt_identity()        #I tried using "current_user" an "get_current_user"
    new_about = About(description=description, user=user_id)

    db.session.add(new_about)
    db.session.commit()
    return jsonify(message="You added a bio"), 201

以下是数据库模型:
from sqlalchemy import Column, Integer, String, FLOAT
from app import db, ma


database models:
class User(db.Model):
    __tablename__ = 'users'
    id = Column(Integer, primary_key=True)
    first_name = Column(String)
    last_name = Column(String)
    email = Column(String, unique=True)
    password = Column(String)

    about = db.relationship('About', backref='user', lazy='dynamic')


class About(db.Model):
    __tablename__ = 'abouts'
    about_id = Column(Integer, primary_key=True)
    description = Column(String(1000))

    user_id = db.Column(db.Integer, db.ForeignKey('users.id'))


class UserSchema(ma.Schema):
    class Meta:
        fields = ('id', 'first_name', 'last_name', 'email', 'password')


class AboutSchema(ma.Schema):
    class Meta:
        fields = ('about_id', 'description')

以下是用户路线:
from flask import Blueprint, jsonify, request
from app import db
# from models.users import User, UserSchema
from models.users import User, UserSchema
from flask_jwt_extended import JWTManager, jwt_required, create_access_token


users = Blueprint('user', __name__)


user_schema = UserSchema()
users_schema = UserSchema(many=True)


@users.route('/register', methods=['POST'])
def register():
    email = request.form['email']
    test = User.query.filter_by(email=email).first()
    if test:
        return jsonify(messgae="that email already exists")
    else:
        first_name = request.form['first_name']
        last_name = request.form['last_name']
        password = request.form['password']
        user = User(first_name=first_name, last_name=last_name, email=email, password=password)
        db.session.add(user)
        db.session.commit()
        return jsonify(messgae="User created successfully"), 201


@users.route('/login', methods=['POST'])
def login():
    if request.is_json:
        email = request.json['email']
        password = request.json['password']
    else:
        email = request.form['email']
        password = request.form['password']

    test = User.query.filter_by(email=email, password=password).first()
    if test:
        access_token = create_access_token(identity=email)
        return jsonify(message="Login succeeded!", access_token=access_token), 200
    else:
        return jsonify(message="Bad email or password"), 401

这是我的数据库管理员的屏幕截图:
enter image description here

最佳答案

当您在登录时注册 jwt token 时,您将使用用户电子邮件注册该 token 。

用户路由

test = User.query.filter_by(email=email, password=password).first()
    if test:
        access_token = create_access_token(identity=email) # identity = email
        return jsonify(message="Login succeeded!", access_token=access_token), 200
    else:
        return jsonify(message="Bad email or password"), 401

所以2个可能的解决方案:
  • 您可以在电子邮件地址的用户表中进行数据库查找并返回用户 ID。
  • @about.route('/add_about', methods=['POST'])
    @jwt_required
    def add_about():
        description = request.form['description']
        user = User.query.filter_by(email=get_jwt_identity()).first() # Filter DB by token (email)
        new_about = About(description=description, user=user)
    
  • 或者您可以将 user.id 注册为 jwt token
  • access_token = create_access_token(identity=test.id)
    

    然后user_id = get_jwt_identity()然后应该从 token 中返回 user.id

    关于python - 如何在flask-jwt-extended中获取当前用户(id)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61116006/

    相关文章:

    python-2.7 - 我有一个可靠的文件。我只想在 flask API 中运行 ansible 文件

    python - 如何在 Flask SQLAlchemy 中按多个条件进行过滤?

    python - 在Python中从句子中删除单词但不删除子词

    python - 如何从 BeautifulSoup 输出中取消转义特殊字符?

    python: jsonify 仅显示一个输出

    python - Firestore Python 中的完成处理

    python - 在获取选择了哪个单选按钮并根据选择发出命令时遇到一些问题

    python - 在一个应用程序中同时使用 Python3 和 Python2.7

    python - 使用 sqlalchemy 类型的数据框 to_sql 的无符号整数

    python - 如何在SqlAlchemy中根据表B选择表A之一?