Отсутствует требуемый позиционный аргумент (datetime) - PullRequest
0 голосов
/ 17 мая 2018

Я новый 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()

и метод Post:

@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'

Что я делаю не так?


1-е печатное заявление:

{'Задачи': [{'имя': 'afasdfdsa '}],' name ':' sdasdfdsaf ',' description ':' df
asfasdf ',' startDate ': '05 / 31/2018', 'endDate': '05 / 31/2018 ','allowTeamToVote ':
True,' голосованияDeadline ': '05 / 31/2018'}

2-й оператор печати:

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

Полное исключение:

127.0.0.1 - - [16 мая / 2018 20:43: 43] «ОПЦИИ / стратегии HTTP / 1.1» 200 - [2018-05-16 20: 43: 44,712] ОШИБКА в приложении: исключение / стратегии [POST] Traceback (большинствопоследний вызов цента): Файл "c: \ users \ jason.virtualenvs \ backend-foekiio5 \ lib \ site-packages \ flask \ app.py", строка 1982, в файле wsgi_app response = self.full_dispatch_request () File "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 (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, в декорированном возвращении f (* args,** kwargs) Файл "C: \ projects \ Python Projects \ three-back \ backend \ src \ main.py", строка 41, в стратегии add_strategy = Стратегия (** sent_strategy.data, creation_by = "HTTP post request")Ошибка типа: init () отсутствует 3 обязательных позиционных аргумента: 'startDate', 'endDate' и 'голосованияDeadline' 127.0.0.1 - - [16 / May / 2018 20:43:44] "POST / стратегииHTTP / 1,1 "500 -

1 Ответ

0 голосов
/ 17 мая 2018

То, что не конвертируется при вызове метода .load (request.get_json ()), это все три значения datetime.

Ваш второй оператор 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")

Зефир имеет другой способ достижения того же результата,как указано в документации здесь .

...