簡體   English   中英

Rest Api 帖子定義失敗 | 蟒蛇| 燒瓶

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM