TypeError: объект функции типа не сериализуем в формате JSON при использовании flask_jwt_extended int RESTful API

Я создаю REST API с помощью flask. Я использую почтальон для тестирования маршрута, который создает новый элемент в моей базе данных, но только если пользователь вошел в систему. Маршруты для регистрации и входа в систему работают хорошо, последний возвращает токен с помощью модуля flask_jwt_extended. Когда я отправляю почтовый запрос на свой / api / notes (создает новую заметку в базе данных), я получаю следующую ошибку:

(...) поднять TypeError (f'Object типа {o. class. name} '

TypeError: объект функции типа не сериализуем в формате JSON

для запроса использую вкладку авторизации почтальона. тип: токен на предъявителя и мой токен в поле (пробовал с кавычками и без них)

Я столкнулся с этой ошибкой сегодня утром, прежде чем реализовать свое отношение «один-много», но я заставил его работать, заменив мой VERY_LONG_TOKEN на VERY_LONG_TOKEN в поле Barear token. Я думал, что, поскольку токен содержит точки, он интерпретируется как функция. Но после реализации отношения я пошел тестировать и снова получил эту ошибку.

мой файл note.py:

from flask import request, Response, jsonify
from app.models import User, Note
from flask_restful import Resource
from flask_jwt_extended import jwt_required, get_jwt_identity

class NotesApi(Resource):
    def get(self):
        notes = Note.objects().to_json()
        return Response(notes, mimetype="application/json", status=200)

    @jwt_required  
    def post(self):  # post method I'm making a request for
        print("fool")  # this doesn't get printed  ->  not reaching 
        user_id = get_jwt_identity()
        data = request.get_json(force=True)
        if data:
            user = User.objects(id=user_id) # logged in user
            note = Note(**data, user_author=user) # creates note with the author
            note.save()
            user.update(push__notes=note) # add this note to users notes
            user.save()
            id = str(note.id)
            return {'id': id}, 200
        else:
            return {'error': 'missing data'}, 400

мой models.py:

from app import db  # using mongodb
from datetime import datetime
from flask_bcrypt import generate_password_hash, check_password_hash

class Note(db.Document):
    title = db.StringField(max_length=120,required=True)
    content = db.StringField(required=True)
    status = db.BooleanField(required=True, default=False)
    date_modified = db.DateTimeField(default=datetime.utcnow)
    user_author = db.ReferenceField('User')
    
class User(db.Document):
    username = db.StringField(max_length=100, required=True, unique=True)
    email = db.StringField(max_length=120, required=True, unique=True)
    password = db.StringField(required=True)
    remember_me = db.BooleanField(default=False)
    notes = db.ListField(db.ReferenceField('Note', reverse_delete_rule=db.PULL)) # one-many relationship

    def hash_password(self):
        self.password = generate_password_hash(self.password).decode('utf8')

    def check_password(self, password):
        return check_password_hash(self.password, password)


User.register_delete_rule(Note, 'user_author', db.CASCADE)

init .py:

from flask import Flask
from config import Config  # my config class to set MONGOBD_HOST and SECRET_CLASS
from flask_mongoengine import MongoEngine
from flask_restful import Api
from flask_bcrypt import Bcrypt
from flask_jwt_extended import JWTManager

app = Flask(__name__)
app.config.from_object(Config)
db = MongoEngine(app)
api = Api(app)
bcrypt = Bcrypt(app)
jwt = JWTManager(app)

from app.resources.routes import initialize_routes
initialize_routes(api) 

ресурсы / routes.py:

from .note import NotesApi, NoteApi
from .auth import SignupApi, LoginApi

def initialize_routes(api):
    api.add_resource(NotesApi, '/api/notes')
    api.add_resource(NoteApi, '/api/note/<id>')
    api.add_resource(SignupApi, '/api/auth/signup')
    api.add_resource(LoginApi, '/api/auth/login')

структура папок:

app
  |_ resources
      |_ auth.py  # signup working well, login also working, return a token (type = String)
      |_ note.py
      |_ routes.py
  |_ __init__.py
  |_ models.py
config.py
appname.py  #just import app and do a app.run()

тело моего почтового запроса:

{
   "title": "test0",
   "content": "test0"  
}

Кто-нибудь сталкивался с этим раньше или знал как решить?

Изменить: добавлена ​​дополнительная информация о коде


person Wiliane Souza    schedule 14.02.2021    source источник
comment
Не могли бы вы предоставить минимальный воспроизводимый пример, пожалуйста? Как новый пользователь, пожалуйста, также пройдите тур и прочтите Как спросить.   -  person Ulrich Eckhardt    schedule 15.02.2021
comment
Извините, я отредактировал свой вопрос, добавив дополнительную информацию. Спасибо.   -  person Wiliane Souza    schedule 15.02.2021
comment
@WilianeSouza Где приложение ломается в файле note.py?   -  person Salem    schedule 15.02.2021
comment
Он не указывал ни на одну строку моего кода в трассировке, но я исправил проблему на основе ответа Мэйлора. Спасибо.   -  person Wiliane Souza    schedule 15.02.2021


Ответы (1)


Похоже, на выходных flask-jwt-extended выпустила новую версию. В рамках изменений API декоратор @jwt_required теперь @jwt_required()

https://flask-jwt-extended.readthedocs.io/en/stable/v4_upgrade_guide/#api-changes

person Maylor    schedule 15.02.2021
comment
не уверен, почему вы упомянули jtw вместо jwt - person Pavneet Singh; 25.05.2021