RESTful API с помощью Flask

В быстром, постоянно развивающемся мире веб-разработок оптимизация — главное правило. Люди хотят получить бесперебойную работу в Интернете и не торопятся уходить, если не получают желаемого. Использование RESTful API с Flask — это способ, с помощью которого разработчики могут улучшить клиентский опыт, чтобы он соответствовал этим ожиданиям, при этом ничего не теряя на стороне сервера. Сочетание повышенной производительности и масштабируемости - идеальное решение для современной веб-разработки.
Использование RESTful API — это безопасный, надежный и эффективный способ передачи информации через интернет. Некоторые ключевые принципы включают: Единый интерфейс, отсутствие статичности, многоуровневая система, возможность кэширования и код по требованию. Это означает, что клиенты могут получить доступ и использовать ресурс (информацию), необходимый им для выполнения своей задачи, с минимальными перерывами, при этом сохраняя связь с другими авторизованными посредниками.
Если бы мы хотели создать приложение для отслеживания бейсболистов с помощью Flask и RESTful API, мы могли бы начать с использования SQLAlchemy для создания базы данных.
class Player(db.Model):
id = db.Column(db.Integer, primary_key=True)
name = db.Column(db.String(100), nullable=False)
position = db.Column(db.String(100), nullable=False)
team = db.Column(db.String(100), nullable=False)
stats = db.relationship('Stat', backref='player')
Теперь у нас есть база данных, которая будет хранить игроков, присваивая им ID, имя, позицию, команду и статистику. Но мы хотим, чтобы каждый игрок отображал свою статистику. Поэтому мы создадим класс stat
, в котором будет следующее.
class Stat(db.Model):
id = db.Column(db.Integer, primary_key=True)
player_id = db.Column(db.Integer, db.ForeignKey('player.id'), nullable=False)
games_played = db.Column(db.Integer)
hits = db.Column(db.Integer)
home_runs = db.Column(db.Integer)
Теперь мы можем проверить для каждого игрока, сколько игр он провел и сколько у него хитов и хоумранов. Это отличное начало, но теперь мы хотим иметь возможность передавать эту информацию клиенту, чтобы он мог использовать ее и управлять ею. Для этого нам нужно создать несколько конечных точек.
Во-первых, мы хотим иметь возможность получить всех игроков из базы данных.
@app.route('/players', methods=['GET'])
def get_players():
players = Player.query.all()
return jsonify([{'id': player.id, 'name': player.name, 'position': player.position, 'team': player.team} for player in players])
Затем мы можем захотеть посмотреть на конкретного игрока. Для этого мы используем ID, назначенный в моделях, а также добавим валидацию ошибок.
@app.route('/players/<int:player_id>', methods=['GET'])
def get_player(player_id):
player = Player.query.get(player_id)
if player:
stats = [{'id': stat.id, 'games_played': stat.games_played, 'hits': stat.hits, 'home_runs': stat.home_runs} for stat in player.stats]
return jsonify({'id': player.id, 'name': player.name, 'position': player.position, 'team': player.team, 'stats': stats})
else:
return jsonify({"error": "Player not found"}), 404
Поиск игроков полезен, но что, если клиент хочет иметь возможность обновлять данные. Для этого нам нужен пост-запрос.
@app.route('/players', methods=['POST'])
def create_player():
data = request.json
player = Player(name=data['name'], position=data['position'], team=data['team'])
db.session.add(player)
db.session.commit()
return jsonify({'id': player.id, 'name': player.name, 'position': player.position, 'team': player.team}), 201
Отлично! Мы создали нового игрока. Но как нам обновить его статистику? Поздоровайтесь с запросом put
.
@app.route('/players/<int:player_id>', methods=['PUT'])
def update_player(player_id):
player = Player.query.get(player_id)
if player:
data = request.json
player.name = data.get('name', player.name)
player.position = data.get('position', player.position)
player.team = data.get('team', player.team)
db.session.commit()
return jsonify({'id': player.id, 'name': player.name, 'position': player.position, 'team': player.team})
else:
return jsonify({"error": "Player not found"}), 404
Теперь вы можете обновить статистику любого игрока в базе данных.
Пока что мы можем получить всех игроков, найти конкретного игрока, добавить игрока и обновить его, поэтому неудивительно, что последний кусочек кода, который нам нужен, — это удаление игрока.
@app.route('/players/<int:player_id>', methods=['DELETE'])
def delete_player(player_id):
player = Player.query.get(player_id)
if player:
db.session.delete(player)
db.session.commit()
return '', 204
else:
return jsonify({"error": "Player not found"}), 404
Теперь у нас есть очень простая структура кода, которая может отслеживать бейсболиста и его статистику, используя RESTful API, SQLAlchemy и Flask. Это хорошая отправная точка для дальнейшего развития.
Благодарю за прочтение!