Как прочитать параметр запроса GET в среде RESTful Flask / SQLAlchemy / Marshmallow - PullRequest
0 голосов
/ 29 января 2019

Я пробежал пару уроков до Рождества, и теперь я пытаюсь понять, откуда я ушел.Попытка научить себя REST, создав несколько простых конечных точек API.Мое замешательство происходит из-за того, что я не могу найти учебники, которые я использовал, и, кажется, есть несколько разных способов решения проблемы.Так что теперь я не уверен, как правильно это сделать.Код работает для возврата всех клиентов в БД, теперь я хочу вернуть конкретного клиента на основе его идентификатора

Хорошо, это то, что у меня есть ...

У меня есть приложение.py, которая определяет ресурс следующим образом:

api.add_resource(CustomerResource, '/Customer')

У меня есть models.py, который определяет класс клиента следующим образом:

ma = Marshmallow()
db = SQLAlchemy()

class Customer(db.Model):
    __tablename__ = 'customers'
    __table_args__ = {"schema":"business"}
    id = db.Column(db.Integer, primary_key=True)
    name = db.Column(db.Text, nullable=False)
    status = db.Column(db.Integer, nullable=False)

class CustomerSchema(ma.Schema):
    id = fields.Integer()
    name = fields.String(required=True)
    status = fields.Integer(required=True)

У меня customer.py, который определяет класс клиентакак это:

customers_schema = CustomerSchema(many=True)
customer_schema = CustomerSchema()

class CustomerResource(Resource):
    def get(self):
        customers = Customer.query.all()
        customers = customers_schema.dump(customers)
        return {'status': 'success', 'data': customers}, 200

Я пытался использовать request.args, но я не верю, что это правильный путь из-за того, что он станет неподдерживаемым.

Итак, выше всегоРаботает с GET, успешно возвращая всех клиентов.Но теперь я хочу использовать GET http://127.0.0.1:5000/api/Customer/10 и просто возвращать данные для идентификатора клиента = 10

. Я не уверен, нужно ли мне определять новый ресурс или существующийCustomerResource можно изменить, чтобы проверить наличие параметра.

Любое руководство приветствуется ...

1 Ответ

0 голосов
/ 29 января 2019

Да, вы правы, не используйте метод request.args, скорее создайте другой ресурс .Помните, что api.add_resource - это просто отображение обработчика на конечную точку RESTFUL .Если бы у вас было много дубликатов кода бизнес-логики , совместно используемых между конечными точками, я бы предложил вам абстрагировать эту бизнес-логику в вспомогательную функцию и , использующую эту вспомогательную функцию в вашем ресурсеопределения, , но в данном конкретном случае это не обязательно.Я хотел бы сделать следующее:

app.py:

api.add_resource(CustomerList, '/Customer')
api.add_resource(Customer, '/Customer/<int:id>')

Я бы переименовал customer.py во что-то вроде rout.py, и этосодержит следующее:

class CustomerList(Resource):
    def get(self):
        customers = Customer.query.all()
        customers = customers_schema.dump(customers)
        return {'status': 'success', 'data': customers}, 200

class Customer(Resource):
    def get(self, id):
        customer = Customer.query.filter_by(id=id).first()
        customer, errors = customers_schema.dump(customer)
        if errors:
           return jsonify(errors), 422
        return customer, 200

Сохраните ваш файл models.py как есть, и я хотел бы рассмотреть возможность использования метода jsonify, который предусмотрена флягой, для возврата ваших данных в ваш файл.ОТДЫХНЫЕ конечные точки.Я показал пример этого в конкретной конечной точке клиента.

Надеюсь, это поможет!

...