烧瓶中有一个关键而严重的大错误 属性错误:'LargeBinary'对象没有属性'output'



我正在Flask(Python(中编程API并在colab上运行这个错误是关于一个我没有使用的对象,还说我使用了它的未知属性这种情况发生在我的所有方法上,它通过邮差测试

#Imports 
from flask import Flask
from flask_restful import Api, Resource, reqparse, abort, fields, marshal_with
from flask_sqlalchemy import SQLAlchemy
from flask_ngrok import run_with_ngrok
#Basic Application Inits
app = Flask(__name__)
api = Api(app)
run_with_ngrok(app)
app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:///database.db'
db = SQLAlchemy(app)
#Database Models
class VideoModel(db.Model):
id = db.Column(db.Integer, primary_key=True)
dish = db.Column(db.String(100), nullable=False)
NumberOfIngridents = db.Column(db.Integer, nullable=False)
Ingridents = db.Column(db.PickleType, nullable=False)
VideoLink = db.Column(db.String(99999999999999), nullable=False)
def __repr__(self,dish,NumberOfIngridents,Ingridents,VideoLink):
return f"Recipes(dish = {dish}, NumberOfIngridents = {NumberOfIngridents}, Ingridents = {Ingridents}, VideoLink = {VideoLink})"
video_put_args = reqparse.RequestParser()
video_put_args.add_argument("dish", type=str, help="Name of the dish is required", required=True)
video_put_args.add_argument("NumberOfIngridents", type=str, help="number of Ingridents is required", required=True)
video_put_args.add_argument("Ingridents", type=str, help="Ingridents of the dish is required", required=True)
video_put_args.add_argument("VideoLink", type=str, help="youtube VideoLink is required", required=True)

video_update_args = reqparse.RequestParser()
video_update_args.add_argument("dish", type=str, help="Name of the dish is required")
video_update_args.add_argument("NumberOfIngridents", type=str, help="number of Ingridents is required")
video_update_args.add_argument("Ingridents", type=str, help="Ingridents of the dish is required")
video_update_args.add_argument("VideoLink", type=str, help="youtube VideoLink is required")

#Dictionaries
resource_fields = {
'id': fields.Integer,
'dish': fields.String,
'NumberOfIngridents': fields.Integer,
'Ingridents':db.PickleType,
'VideoLink':fields.String
}
db.create_all()
class Recipe(Resource):
@marshal_with(resource_fields)
def get(self, id):
result = VideoModel.query.filter_by(id=id).first()
if not result:
abort(404, message="Could not find Dish with that id")
return result
@marshal_with(resource_fields)
def put(self, id):
args = video_put_args.parse_args()
result = VideoModel.query.filter_by(id=id).first()
if result:
abort(409, message="Dish id taken...")
Recipes = VideoModel(id=id, dish=args['dish'], NumberOfIngridents=args['NumberOfIngridents'], Ingridents=args['Ingridents'], VideoLink=args['VideoLink'])
db.session.add(Recipes)
return Recipes, 201
db.session.commit()
@marshal_with(resource_fields)
def patch(self, id):
args = video_update_args.parse_args()
result = VideoModel.query.filter_by(id=id).first()
if not result:
abort(404, message="Dish doesn't exist, cannot update")
if args['dish']:
result.name = args['dish']
if args['NumberOfIngridents']:
result.userName = args['NumberOfIngridents']
if args['Ingridents']:
result.name = args['Ingridents']
if args['VideoLink']:
result.userName = args['VideoLink']
return result
db.session.commit()

def delete(self, id, Recipes):
del Recipes[id]
return '', 204

api.add_resource(Recipe, '/<int:id>')
if __name__ == "__main__":
app.run()

上面我已经提供了我的main.py文件和下面的错误

[2021-12-29 17:02:00,195] ERROR in app: Exception on /1 [GET]
Traceback (most recent call last):
File "/usr/local/lib/python3.7/dist-packages/flask/app.py", line 1950, in full_dispatch_request
rv = self.dispatch_request()
File "/usr/local/lib/python3.7/dist-packages/flask/app.py", line 1936, in dispatch_request
return self.view_functions[rule.endpoint](**req.view_args)
File "/usr/local/lib/python3.7/dist-packages/flask_restful/__init__.py", line 467, in wrapper
resp = resource(*args, **kwargs)
File "/usr/local/lib/python3.7/dist-packages/flask/views.py", line 89, in view
return self.dispatch_request(*args, **kwargs)
File "/usr/local/lib/python3.7/dist-packages/flask_restful/__init__.py", line 582, in dispatch_request
resp = meth(*args, **kwargs)
File "/usr/local/lib/python3.7/dist-packages/flask_restful/__init__.py", line 679, in wrapper
return marshal(resp, self.fields, self.envelope)
File "/usr/local/lib/python3.7/dist-packages/flask_restful/__init__.py", line 635, in marshal
return OrderedDict([(envelope, OrderedDict(items))]) if envelope else OrderedDict(items)
File "/usr/local/lib/python3.7/dist-packages/flask_restful/__init__.py", line 634, in <genexpr>
for k, v in fields.items())
File "/usr/local/lib/python3.7/dist-packages/sqlalchemy/sql/type_api.py", line 1313, in __getattr__
return getattr(self.impl, key)
AttributeError: 'LargeBinary' object has no attribute 'output'
127.0.0.1 - - [29/Dec/2021 17:02:00] "GET /1 HTTP/1.1" 500 -

我认为错误出现在下面的行上:

resource_fields = {
'id': fields.Integer,
'dish': fields.String,
'NumberOfIngridents': fields.Integer,
'Ingridents':db.PickleType,            ### error on this line
'VideoLink':fields.String
}

注意,该resource_fieldsdict中的所有其他值的形式都是fields.Something?你在这里传递了错误类型的值。

根据SQLAlchemy文档,db.PickleType使用LargeBinary作为默认实现。这解释了错误消息中出现LargeBinary的原因。此外,如果您查看字段的Flask RESTful文档,您会发现所有字段类都有一个output方法。Flask似乎希望resource_fields中的值是字段,所以它可以调用这些字段的output方法,但您给了它一些没有output方法的其他方法。

在可用的各种类型的字段中,我想fields.Raw将是最适合用于本专栏的字段。也许你自己浏览了一下列表,得出的结论是没有一个真正适合,而是放了数据库类型,因为你不知道还应该放什么?无论如何,试着用替换错误的行

'Ingridents': fields.Raw,

免责声明:我以前从未使用过Flask或SQLAlchemy,也没有测试过这个。您的代码中也可能存在其他不明显的问题,因为此错误阻止了访问代码中错误的部分。

最新更新