zasqer
@zasqer

Как сделать параметр в url роутинге опциональным?

Создаю REST API, endpoint user и хочу сделать параметр id опциональным.
Конечный результат должен быть таким:
1)GET '/user' возвращает всех пользователей
2)GET '/user/1' возвращает пользователя с id == 1

временно решил задачу, задав две разные функции - users() и user(id)

@app.route('/user', methods=['GET', 'POST'])
def users():
    if request.method == 'GET':
        users = User.query.all()
        return jsonify(num_results=len(users),
                       objects=[user.serialize() for user in users])

@app.route('/user/<int:id>', methods=['GET', 'PUT', 'DELETE'])
def user(id):
    if request.method == 'GET':
        user = User.query.filter(User.id == id).first()
        return jsonify(user=user.name)


есть ли более правильный способ сделать параметр опциональным?
  • Вопрос задан
  • 2682 просмотра
Решения вопроса 1
sim3x
@sim3x
@app.route('/user', methods=['GET', 'POST'])
@app.route('/user/<int:id>', methods=['GET', 'PUT', 'DELETE'])
def users(id=None):
    if request.method == 'GET':
        users = User.query.all()
        return jsonify(num_results=len(users),
                       objects=[user.serialize() for user in users])
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
@akaRem
Есть еще вариант

from flask import Flask
app = Flask(__name__)

@app.route('/', defaults={'path': ''})
@app.route('/<path:path>')
def catch_all(path):
    return 'You want path: %s' % path

if __name__ == '__main__':
    app.run()


% curl 127.0.0.1:5000          # Matches the first rule
You want path:  
% curl 127.0.0.1:5000/foo/bar  # Matches the second rule
You want path: foo/bar
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы