Генерация REST-клиента из источников Flask - PullRequest
0 голосов
/ 25 октября 2019

Есть ли способ / инструмент / lib для генерации REST-клиента Python из исходников приложения Flask?

Допустим, у меня есть приложение, представляющее REST API, созданное с помощью Flask. Примерно так:

@api.route('/pets')
def get_pets():
    return jsonify(PetController.get_pets())

@api.route('/pets/<pet_id>')
def get_pet(pet_id):
    return jsonify(PetController.get_pet(pet_id))

@api.route('/pets/<pet_id>', methods=['PUT'])
@validate('v1_pets', 'update')
def update_pet(pet_id):
    return jsonify(PetController.update_pet(pet_id, get_payload()))

@api.route('/pets/<pet_id>', methods=['DELETE'])
def delete_pet(pet_id):
    return jsonify(PetController.delete_pet(pet_id)), 204

...

Это хорошо работает.

Теперь я хотел бы сгенерировать клиента (или, по крайней мере, клиентский скелет) из этих источников;и иметь возможность использовать этот клиент в другом приложении для запроса API. Я хотел бы автоматически генерировать что-то подобное на основе исходных текстов моего приложения Flask:

import requests

class Pet():
    def __init__(self, user, password, url):
        self.auth = requests.auth.HTTPBasicAuth(user, password)
        self.user = user
        self.password = password
        self.url = url
        self.headers = {'Content-Type': 'application/json'}

    def get_pets(self):
        response = requests.get(
            "{}{}".format(self.url, '/pets'),
            auth=self.auth,
            headers=self.headers
        )
        if response.status_code == 200:
            return json.loads(response.text)
        else:
            raise PetException(response.status_code, json.loads(response.text)['message'])      

    def get_pet(self, pet_id):
        response = requests.get(
            "{}{}{}".format(self.url, '/pets/', pet_id),
            auth=self.auth,
            headers=self.headers
        )
        if response.status_code == 200:
            return json.loads(response.text)
        else:
            raise PetException(response.status_code, json.loads(response.text)['message'])        

    def update_pet(self, pet_id, new_pet_data):
        response = requests.put(
            "{}{}{}".format(self.url, '/pets/', pet_id),
            auth=self.auth,
            headers=self.headers,
            data=json.dumps(new_pet_data)           
        )
        if response.status_code == 200:
            return json.loads(response.text)
        else:
            raise PetException(response.status_code, json.loads(response.text)['message'])  

...

(это всего лишь пример, мне все равно, выглядит ли клиент для генерации точно так же)

Тогда в другом приложении я мог бы легко использовать этот клиент так:

from petclient import Pet

def foobar():
    pets = Pet.get_pets()
    one_pet = Pet.get_pet('8')
    updated_pet = Pet.update_pet('7', {'name':'bozo', 'age': 8})
...

Возможно ли это?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...