Есть ли способ / инструмент / 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})
...
Возможно ли это?