Rest API POST 定义失败 | Python | Flask

huangapple go评论109阅读模式
英文:

Rest Api post definition failing | Python | Flask

问题

I am very new to python. I have basic idea with python and flask is totally new for me. Trying to learn rest api with python using flask. But, I am facing the issue while posting data. below are sample code and error. Please help me to fix this issue. Thanks in advance. I tried googling but did not get any solution.

Error while running

  1. 127.0.0.1 - - [03/Jan/2020 15:58:54] "POST /api/User HTTP/1.1" 500 -
  2. Traceback (most recent call last):
  3. File "/usr/local/lib/python3.7/site-packages/flask/app.py", line 1997, in __call__
  4. return self.wsgi_app(environ, start_response)
  5. File "/usr/local/lib/python3.7/site-packages/flask/app.py", line 1985, in wsgi_app
  6. response = self.handle_exception(e)
  7. File "/usr/local/lib/python3.7/site-packages/flask_restful/__init__.py", line 273, in error_router
  8. return original_handler(e)
  9. File "/usr/local/lib/python3.7/site-packages/flask/app.py", line 1540, in handle_exception
  10. reraise(exc_type, exc_value, tb)
  11. File "/usr/local/lib/python3.7/site-packages/flask/_compat.py", line 32, in reraise
  12. raise value.with_traceback(tb)
  13. File "/usr/local/lib/python3.7/site-packages/flask/app.py", line 1982, in wsgi_app
  14. response = self.full_dispatch_request()
  15. File "/usr/local/lib/python3.7/site-packages/flask/app.py", line 1614, in full_dispatch_request
  16. rv = self.handle_user_exception(e)
  17. File "/usr/local/lib/python3.7/site-packages/flask_restful/__init__.py", line 273, in error_router
  18. return original_handler(e)
  19. File "/usr/local/lib/python3.7/site-packages/flask/app.py", line 1517, in handle_user_exception
  20. reraise(exc_type, exc_value, tb)
  21. File "/usr/local/lib/python3.7/site-packages/flask/_compat.py", line 32, in reraise
  22. raise value.with_traceback(tb)
  23. File "/usr/local/lib/python3.7/site-packages/flask/app.py", line 1612, in full_dispatch_request
  24. rv = thispatch_request()
  25. File "/usr/local/lib/python3.7/site-packages/flask/app.py", line 1598, in dispatch_request
  26. return self.view_functions[rule.endpoint](**req.view_args)
  27. File "/usr/local/lib/python3.7/site-packages/flask_restful/__init__.py", line 480, in wrapper
  28. resp = resource(*args, **kwargs)
  29. File "/usr/local/lib/python3.7/site-packages/flask/views.py", line 84, in view
  30. return thispatch_request(*args, **kwargs)
  31. File "/usr/local/lib/python3.7/site-packages/flask_restful/__init__.py", line 595, in dispatch_request
  32. resp = meth(*args, **kwargs)
  33. File "/Users/z0034ff/Documents/music/resources/Users.py", line 32, in post
  34. typeid=json_data['typeid'],
  35. TypeError: __init__() got an unexpected keyword argument 'fname'

File name: Model.py

  1. from flask import Flask
  2. from marshmallow import Schema, fields, pre_load, validate
  3. from flask_marshmallow import Marshmallow
  4. from flask_sqlalchemy import SQLAlchemy
  5. ma = Marshmallow()
  6. db = SQLAlchemy()
  7. class Users(db.Model):
  8. __tablename__ = 'users'
  9. id = db.Column(db.Integer, primary_key=True)
  10. fname = db.Column(db.String(50), nullable=False)
  11. lname = db.Column(db.String(50), nullable=False)
  12. email = db.Column(db.String(100), nullable=False)
  13. phone = db.Column(db.String(50), nullable=False)
  14. typeid = db.Column(db.Integer, db.ForeignKey(
  15. 'user_type.id', ondelete='CASCADE'), nullable=False)
  16. creation_date = db.Column(
  17. db.TIMESTAMP, server_default=db.func.current_timestamp(), nullable=False)
  18. def __init__(self, users, typeid):
  19. self.users = users
  20. self.typeid = typeid
  21. class UsersSchema(ma.Schema):
  22. id = fields.Integer(dump_only=True)
  23. fname = fields.String(required=True, validate=validate.Length(1))
  24. lname = fields.String(required=True, validate=validate.Length(1))
  25. email = fields.String(required=True, validate=validate.Length(1))
  26. phone = fields.String(required=True, validate=validate.Length(10))
  27. typeid = fields.Integer(required=True)
  28. creation_date = fields.DateTime()

File name: Users.py

  1. from flask import jsonify, request
  2. from flask_restful import Resource
  3. from Model import db, Users, UsersSchema
  4. users_schema = UsersSchema(many=True)
  5. user_schema = UsersSchema()
  6. class UsersResource(Resource):
  7. def get(self):
  8. users = Users.query.all()
  9. users = users_schema.dump(users).data
  10. return {"status": "success", "data": users}, 200
  11. def post(self):
  12. json_data = request.get_json(force=True)
  13. if not json_data:
  14. return {'message': 'No input data provided'}, 400
  15. # Validate and deserialize input
  16. data, errors = user_schema.load(json_data)
  17. if errors:
  18. return errors, 422
  19. user = Users.query.filter_by(email=data['email']).first()
  20. if user:
  21. return {'message': 'User already exists'}, 400
  22. print(json_data['fname'])
  23. user = Users(
  24. fname=json_data['fname'],
  25. lname=json_data['lname'],
  26. email=json_data['email'],
  27. phone=json_data['phone'],
  28. typeid=json_data['typeid'],
  29. )
  30. db.session.add(user)
  31. db.session.commit()
  32. result = user_schema.dump(user).data
  33. return {"status": 'success', 'data': result}, 201
英文:

I am very new to python. I have basic idea with python and flask is totally new for me. Trying to learn rest api with python using flask. But, I am facing the issue while posting data. below are sample code and error. Please help me to fix this issue. Thanks in advance. I tried googling but did not get any solution.

Error while running

  1. 127.0.0.1 - - [03/Jan/2020 15:58:54] "POST /api/User HTTP/1.1" 500 -
  2. Traceback (most recent call last):
  3. File "/usr/local/lib/python3.7/site-packages/flask/app.py", line 1997, in __call__
  4. return self.wsgi_app(environ, start_response)
  5. File "/usr/local/lib/python3.7/site-packages/flask/app.py", line 1985, in wsgi_app
  6. response = self.handle_exception(e)
  7. File "/usr/local/lib/python3.7/site-packages/flask_restful/__init__.py", line 273, in error_router
  8. return original_handler(e)
  9. File "/usr/local/lib/python3.7/site-packages/flask/app.py", line 1540, in handle_exception
  10. reraise(exc_type, exc_value, tb)
  11. File "/usr/local/lib/python3.7/site-packages/flask/_compat.py", line 32, in reraise
  12. raise value.with_traceback(tb)
  13. File "/usr/local/lib/python3.7/site-packages/flask/app.py", line 1982, in wsgi_app
  14. response = self.full_dispatch_request()
  15. File "/usr/local/lib/python3.7/site-packages/flask/app.py", line 1614, in full_dispatch_request
  16. rv = self.handle_user_exception(e)
  17. File "/usr/local/lib/python3.7/site-packages/flask_restful/__init__.py", line 273, in error_router
  18. return original_handler(e)
  19. File "/usr/local/lib/python3.7/site-packages/flask/app.py", line 1517, in handle_user_exception
  20. reraise(exc_type, exc_value, tb)
  21. File "/usr/local/lib/python3.7/site-packages/flask/_compat.py", line 32, in reraise
  22. raise value.with_traceback(tb)
  23. File "/usr/local/lib/python3.7/site-packages/flask/app.py", line 1612, in full_dispatch_request
  24. rv = self.dispatch_request()
  25. File "/usr/local/lib/python3.7/site-packages/flask/app.py", line 1598, in dispatch_request
  26. return self.view_functions[rule.endpoint](**req.view_args)
  27. File "/usr/local/lib/python3.7/site-packages/flask_restful/__init__.py", line 480, in wrapper
  28. resp = resource(*args, **kwargs)
  29. File "/usr/local/lib/python3.7/site-packages/flask/views.py", line 84, in view
  30. return self.dispatch_request(*args, **kwargs)
  31. File "/usr/local/lib/python3.7/site-packages/flask_restful/__init__.py", line 595, in dispatch_request
  32. resp = meth(*args, **kwargs)
  33. File "/Users/z0034ff/Documents/music/resources/Users.py", line 32, in post
  34. typeid=json_data['typeid'],
  35. TypeError: __init__() got an unexpected keyword argument 'fname'

File name: Model.py

  1. from flask import Flask
  2. from marshmallow import Schema, fields, pre_load, validate
  3. from flask_marshmallow import Marshmallow
  4. from flask_sqlalchemy import SQLAlchemy
  5. ma = Marshmallow()
  6. db = SQLAlchemy()
  7. class Users(db.Model):
  8. __tablename__ = 'users'
  9. id = db.Column(db.Integer, primary_key=True)
  10. fname = db.Column(db.String(50), nullable=False)
  11. lname = db.Column(db.String(50), nullable=False)
  12. email = db.Column(db.String(100), nullable=False)
  13. phone = db.Column(db.String(50), nullable=False)
  14. typeid = db.Column(db.Integer, db.ForeignKey(
  15. 'user_type.id', ondelete='CASCADE'), nullable=False)
  16. creation_date = db.Column(
  17. db.TIMESTAMP, server_default=db.func.current_timestamp(), nullable=False)
  18. def __init__(self, users, typeid):
  19. self.users = users
  20. self.typeid = typeid
  21. class UsersSchema(ma.Schema):
  22. id = fields.Integer(dump_only=True)
  23. fname = fields.String(required=True, validate=validate.Length(1))
  24. lname = fields.String(required=True, validate=validate.Length(1))
  25. email = fields.String(required=True, validate=validate.Length(1))
  26. phone = fields.String(required=True, validate=validate.Length(10))
  27. typeid = fields.Integer(required=True)
  28. creation_date = fields.DateTime()

File name: Users.py

  1. from flask import jsonify, request
  2. from flask_restful import Resource
  3. from Model import db, Users, UsersSchema
  4. users_schema = UsersSchema(many=True)
  5. user_schema = UsersSchema()
  6. class UsersResource(Resource):
  7. def get(self):
  8. users = Users.query.all()
  9. users = users_schema.dump(users).data
  10. return {"status": "success", "data": users}, 200
  11. def post(self):
  12. json_data = request.get_json(force=True)
  13. if not json_data:
  14. return {'message': 'No input data provided'}, 400
  15. # Validate and deserialize input
  16. data, errors = user_schema.load(json_data)
  17. if errors:
  18. return errors, 422
  19. user = Users.query.filter_by(email=data['email']).first()
  20. if user:
  21. return {'message': 'User already exists'}, 400
  22. print(json_data['fname'])
  23. user = Users(
  24. fname=json_data['fname'],
  25. lname=json_data['lname'],
  26. email=json_data['email'],
  27. phone=json_data['phone'],
  28. typeid=json_data['typeid'],
  29. )
  30. db.session.add(user)
  31. db.session.commit()
  32. result = user_schema.dump(user).data
  33. return {"status": 'success', 'data': result}, 201

答案1

得分: 1

不需要定义SQLAlchemy模型构造函数。SQLAlchemy文档 解释道:

> 使用声明式系统定义的User类
> 已经提供了一个构造函数(例如__init__()方法)
> 它会自动接受与我们映射的列匹配的关键字名称。
> 我们可以在类上定义任何明确的__init__()方法,
> 它会覆盖由声明式提供的默认方法。

Users.py的第27行,您尝试创建Users对象

  1. Users(
  2. fname=json_data['fname'],
  3. lname=json_data['lname'],
  4. email=json_data['email'],
  5. phone=json_data['phone'],
  6. typeid=json_data['typeid'],
  7. )

而在Model.py中,Users类的构造函数只接受2个参数。

  1. class Users(db.Model):
  2. ....
  3. def __init__(self, users, typeid):
  4. ...

这就是错误的来源:
TypeError: __init__() got an unexpected keyword argument 'fname'

移除__init__之后,应该可以正常工作。

英文:

It is not necessary to define SQLAlchemy model constructor. The SQLAlchemy docs explains:

> Our User class, as defined using the Declarative system,
> has been provided with a constructor (e.g. init() method)
> which automatically accepts keyword names that match the columns we’ve mapped.
> We are free to define any explicit init() method we prefer on our class,
> which will override the default method provided by Declarative.

In Users.py line 27 you try to create Users object

  1. Users(
  2. fname=json_data['fname'],
  3. lname=json_data['lname'],
  4. email=json_data['email'],
  5. phone=json_data['phone'],
  6. typeid=json_data['typeid'],
  7. )

Where in Model.py constructor of Users class takes only 2 arguments.

  1. class Users(db.Model):
  2. ....
  3. def __init__(self, users, typeid):
  4. ...

That's where the error comes from:
TypeError: __init__() got an unexpected keyword argument 'fname'

After removing __init__ it should work fine.

huangapple
  • 本文由 发表于 2020年1月3日 18:40:05
  • 转载请务必保留本文链接:https://go.coder-hub.com/59577085.html
匿名

发表评论

匿名网友

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen:

确定