[英]Rest Api post definition failing | Python | Flask
我對python很陌生。 我對 python 有基本的想法,而燒瓶對我來說是全新的。 嘗試使用flask使用python學習rest api。 但是,我在發布數據時遇到了這個問題。 下面是示例代碼和錯誤。 請幫我解決這個問題。 提前致謝。 我嘗試谷歌搜索,但沒有得到任何解決方案。
運行時出錯
127.0.0.1 - - [03/Jan/2020 15:58:54] "POST /api/User HTTP/1.1" 500 -
Traceback (most recent call last):
File "/usr/local/lib/python3.7/site-packages/flask/app.py", line 1997, in __call__
return self.wsgi_app(environ, start_response)
File "/usr/local/lib/python3.7/site-packages/flask/app.py", line 1985, in wsgi_app
response = self.handle_exception(e)
File "/usr/local/lib/python3.7/site-packages/flask_restful/__init__.py", line 273, in error_router
return original_handler(e)
File "/usr/local/lib/python3.7/site-packages/flask/app.py", line 1540, in handle_exception
reraise(exc_type, exc_value, tb)
File "/usr/local/lib/python3.7/site-packages/flask/_compat.py", line 32, in reraise
raise value.with_traceback(tb)
File "/usr/local/lib/python3.7/site-packages/flask/app.py", line 1982, in wsgi_app
response = self.full_dispatch_request()
File "/usr/local/lib/python3.7/site-packages/flask/app.py", line 1614, in full_dispatch_request
rv = self.handle_user_exception(e)
File "/usr/local/lib/python3.7/site-packages/flask_restful/__init__.py", line 273, in error_router
return original_handler(e)
File "/usr/local/lib/python3.7/site-packages/flask/app.py", line 1517, in handle_user_exception
reraise(exc_type, exc_value, tb)
File "/usr/local/lib/python3.7/site-packages/flask/_compat.py", line 32, in reraise
raise value.with_traceback(tb)
File "/usr/local/lib/python3.7/site-packages/flask/app.py", line 1612, in full_dispatch_request
rv = self.dispatch_request()
File "/usr/local/lib/python3.7/site-packages/flask/app.py", line 1598, in dispatch_request
return self.view_functions[rule.endpoint](**req.view_args)
File "/usr/local/lib/python3.7/site-packages/flask_restful/__init__.py", line 480, in wrapper
resp = resource(*args, **kwargs)
File "/usr/local/lib/python3.7/site-packages/flask/views.py", line 84, in view
return self.dispatch_request(*args, **kwargs)
File "/usr/local/lib/python3.7/site-packages/flask_restful/__init__.py", line 595, in dispatch_request
resp = meth(*args, **kwargs)
File "/Users/z0034ff/Documents/music/resources/Users.py", line 32, in post
typeid=json_data['typeid'],
TypeError: __init__() got an unexpected keyword argument 'fname'
文件名:模型.py
from flask import Flask
from marshmallow import Schema, fields, pre_load, validate
from flask_marshmallow import Marshmallow
from flask_sqlalchemy import SQLAlchemy
ma = Marshmallow()
db = SQLAlchemy()
class Users(db.Model):
__tablename__ = 'users'
id = db.Column(db.Integer, primary_key=True)
fname = db.Column(db.String(50), nullable=False)
lname = db.Column(db.String(50), nullable=False)
email = db.Column(db.String(100), nullable=False)
phone = db.Column(db.String(50), nullable=False)
typeid = db.Column(db.Integer, db.ForeignKey(
'user_type.id', ondelete='CASCADE'), nullable=False)
creation_date = db.Column(
db.TIMESTAMP, server_default=db.func.current_timestamp(), nullable=False)
def __init__(self, users, typeid):
self.users = users
self.typeid = typeid
class UsersSchema(ma.Schema):
id = fields.Integer(dump_only=True)
fname = fields.String(required=True, validate=validate.Length(1))
lname = fields.String(required=True, validate=validate.Length(1))
email = fields.String(required=True, validate=validate.Length(1))
phone = fields.String(required=True, validate=validate.Length(10))
typeid = fields.Integer(required=True)
creation_date = fields.DateTime()
文件名:Users.py
from flask import jsonify, request
from flask_restful import Resource
from Model import db, Users, UsersSchema
users_schema = UsersSchema(many=True)
user_schema = UsersSchema()
class UsersResource(Resource):
def get(self):
users = Users.query.all()
users = users_schema.dump(users).data
return {"status": "success", "data": users}, 200
def post(self):
json_data = request.get_json(force=True)
if not json_data:
return {'message': 'No input data provided'}, 400
# Validate and deserialize input
data, errors = user_schema.load(json_data)
if errors:
return errors, 422
user = Users.query.filter_by(email=data['email']).first()
if user:
return {'message': 'User already exists'}, 400
print(json_data['fname'])
user = Users(
fname=json_data['fname'],
lname=json_data['lname'],
email=json_data['email'],
phone=json_data['phone'],
typeid=json_data['typeid'],
)
db.session.add(user)
db.session.commit()
result = user_schema.dump(user).data
return {"status": 'success', 'data': result}, 201
沒有必要定義SQLAlchemy
模型構造函數。 SQLAlchemy 文檔解釋了:
我們的 User 類,如使用聲明式系統定義的,已經提供了一個構造函數(例如init () 方法),它自動接受與我們映射的列匹配的關鍵字名稱。 我們可以自由地在我們的類上定義任何我們喜歡的顯式init () 方法,這將覆蓋 Declarative 提供的默認方法。
在Users.py
第 27 行中,您嘗試創建Users
對象
Users(
fname=json_data['fname'],
lname=json_data['lname'],
email=json_data['email'],
phone=json_data['phone'],
typeid=json_data['typeid'],
)
凡在Model.py
的構造Users
級只需要2個參數。
class Users(db.Model):
....
def __init__(self, users, typeid):
...
這就是錯誤的來源: TypeError: __init__() got an unexpected keyword argument 'fname'
刪除__init__
它應該可以正常工作。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.