【问题标题】:Missing required positional argument (datetime)缺少必需的位置参数(日期时间)
【发布时间】:2018-10-27 04:43:53
【问题描述】:

我是新的 Flask 和 Postgres...

我正在学习本教程: https://auth0.com/blog/using-python-flask-and-angular-to-build-modern-apps-part-1/

我创建了一个这样的实体:

from marshmallow import Schema, fields
from sqlalchemy import Column, String, Boolean, Date

from .entity import Entity, Base


class Strategy(Entity, Base):
    __tablename__ = 'strategies'

    name = Column(String)
    description = Column(String)
    startDate = Column(Date)
    endDate = Column(Date)
    allowTeamToVote = Column(Boolean)
    votingDeadline = Column(Date)
    isActive = Column(Boolean)

    def __init__(self, name, description, startDate, endDate, allowTeamToVote, votingDeadline, created_by):
        Entity.__init__(self, created_by)
        self.name = name
        self.description = description
        self.startDate = startDate
        self.endDate = endDate
        self.allowTeamToVote = allowTeamToVote
        self.votingDeadline = votingDeadline
        self.isActive = True

class StrategySchema(Schema):
    id = fields.Number()
    name = fields.Str()    
    description = fields.Str()
    startDate = fields.DateTime()
    endDate = fields.DateTime()
    allowTeamToVote = fields.Boolean()
    votingDeadline = fields.DateTime()
    isActive = fields.Boolean()
    created_at = fields.DateTime()
    updated_at = fields.DateTime()
    last_updated_by = fields.Str()

还有一个发布方法:

@app.route('/strategies', methods=['POST'])
@requires_auth
def add_strategy():
    # mount Strategy object
    print(request.get_json())
    posted_strategy = StrategySchema(only=('name', 'description', 'startDate', 'endDate', 'allowTeamToVote', 'votingDeadline', 'isActive'))\
        .load(request.get_json())
print(posted_strategy.data)


    strategy = Strategy(**posted_strategy.data, created_by="HTTP post request")

    # persist Strategy
    session = Session()
    session.add(strategy)
    session.commit()

    # return created Strategy
    new_strategy = StrategySchema().dump(Strategy).data
    session.close()
    return jsonify(new_strategy), 201

调用 .load(request.get_json()) 方法时没有转换的是所有三个日期时间值。

我收到以下错误:

 __init__() missing 3 required positional arguments: 'startDate', 'endDate', and 'votingDeadline'

我做错了什么?


第一个打印语句:

{'目标': [{'name': 'afasdfdsa'}], 'name': 'sdasdfdsaf', '描述':'df
asfasdf','startDate':'05/31/2018','endDate':'05/31/2018', 'allowTeamToVote':
是的,'votingDeadline':'05/31/2018'}

第二个打印语句:

{'allowTeamToVote': True, 'name': 'asfdfsd', 'description': 'dsfasdfs'}

完全例外:

127.0.0.1 - - [16/May/2018 20:43:43] “OPTIONS /strategies HTTP/1.1”200 - [2018-05-16 20:43:44,712] 应用程序中的错误:/strategies 异常 [POST] Traceback(最近一次通话最后一次):文件 "c:\users\jason.virtualenvs\backend-foekiio5\lib\site-packages\flask\app.py", 第 1982 行,在 wsgi_app 中 响应 = self.full_dispatch_request() 文件“c:\users\jason.virtualenvs\backend-foekiio5\lib\site-packages\flask\app.py”, 第 1614 行,在 full_dispatch_request 中 rv = self.handle_user_exception(e) 文件“c:\users\jason.virtualenvs\backend-foekiio5\lib\site-packages\flask_cors\extension.py”, 第 161 行,在 Wrapped_function 中 返回 cors_after_request(app.make_response(f(*args, **kwargs))) 文件 "c:\users\jason.virtualenvs\backend-foekiio5\lib\site-packages\flask\app.py", 第 1517 行,在 handle_user_exception 中 reraise(exc_type, exc_value, tb) 文件“c:\users\jason.virtualenvs\backend-foekiio5\lib\site-packages\flask_compat.py”, 第 33 行,在再加注中 提高价值文件“c:\users\jason.virtualenvs\backend-foekiio5\lib\site-packages\flask\app.py”, 第 1612 行,在 full_dispatch_request 中 rv = self.dispatch_request() 文件“c:\users\jason.virtualenvs\backend-foekiio5\lib\site-packages\flask\app.py”, 第 1598 行,在 dispatch_request 中 返回 self.view_functionsrule.endpoint 文件“C:\projects\Python Projects\three-back\backend\src\auth.py”,行 101,在装修 return f(*args, **kwargs) File "C:\projects\Python Projects\three-back\backend\src\main.py",第 41 行,在 add_strategy strategy = Strategy(**posted_strategy.data, created_by="HTTP post request") TypeError: init() missing 3 required positional 参数:“startDate”、“endDate”和“votingDeadline” 127.0.0.1 - - [16/May/2018 20:43:44] “POST /strategies HTTP/1.1”500 -

【问题讨论】:

  • 您可以添加打印语句返回的内容吗?
  • @AnilRedshift 添加打印语句和完整异常

标签: python postgresql flask flask-sqlalchemy


【解决方案1】:

.load(request.get_json()) 方法时没有转换的内容 调用的是所有三个日期时间值。

您的第二个 print 语句在函数之外。所以你得到了错误的输出。

我收到以下错误:

您正在向该方法传递一个 dict(键值对),但它需要位置参数。

将此行更改为:

`strategy = Strategy(*posted_strategy.data.values(), created_by="HTTP post request")`

总之是这样的:

@app.route('/strategies', methods=['POST'])
@requires_auth
def add_strategy():
    # mount Strategy object
    print(request.get_json())
    posted_strategy = StrategySchema(only=('name', 'description', 'startDate', 'endDate', 'allowTeamToVote', 'votingDeadline', 'isActive'))\
        .load(request.get_json())
    print(posted_strategy.data)


    strategy = Strategy(*posted_strategy.data.values(), created_by="HTTP post request")

Marshmallow 有另一种实现相同结果的方法,如 documentation here 中所述。

【讨论】:

  • 同样的结果:add_strategy strategy = Strategy(*posted_strategy.data.values(), created_by="HTTP post request") TypeError: __init__() missing 3 required positional arguments: 'endDate', 'allowTeamToVote', and 'votingDeadline'
  • 您的第二份打印声明现在给您什么。也尝试打印出posted_strategy.data.values()。它应该返回一个列表
猜你喜欢
  • 2019-03-04
  • 2021-04-07
  • 1970-01-01
  • 2021-04-10
  • 2019-12-01
  • 2018-09-09
  • 2014-09-13
  • 1970-01-01
相关资源
最近更新 更多