Как правильно делиться кодом между клиентом и сервером с помощью swagger / openapi

Я пытаюсь понять, как использовать openapi-generator, чтобы минимизировать дублирование кода Python между клиентом и сервером. Если это важно, я использую FastAPI в качестве веб-фреймворка вместе с Pydantic.

На стороне сервера у меня есть:

class Member(BaseModel):
    name: str
    def greeting(self):
        return "Hello " + name

Затем я могу написать:

m1 = Member("John Doe")
print(m1.greeting())

Пока все хорошо с точки зрения сервера.

Затем в FastAPI я создаю API

@app.get("/members/", response_model=List[Member])
def get_members():
    m1 = Member("Jane Doe")
    m2 = Member("John Smith")
    return [m1, m2]

После того, как я сгенерирую клиентский код с помощью openapi-generator, я могу написать: my_members = my_api.get_members() на стороне клиента. До этого момента все работает отлично.

Однако теперь именно здесь возникает проблема. Я хочу вызвать my_members[0].greeting() на клиенте, но это недоступно в клиентской библиотеке, созданной openapi-generator. Он не генерирует никаких вспомогательных функций, что означает, что мне нужно придумать более сложный способ совместного использования структур данных и методов между клиентом и сервером.

Я ошибаюсь, думая о совместном использовании кода таким образом? Есть ли лучший подход?


person user2558918    schedule 17.05.2020    source источник
comment
Нашли ли вы какую-либо документацию, в которой говорится, что вы можете поделиться конкретной реализацией кода через openapi-generator. Что бы вы хотели сделать, если у вас есть зависимый от платформы код или языковая библиотека (например, numpy в Python). Я не думаю, что это возможно.   -  person Guillaume Jacquenot    schedule 17.05.2020
comment
Я не нашел никаких документов, связанных с этим, хотя я новичок в openapi-generator. Для клиентских заглушек, созданных для того же языка, что и язык сервера (в моем случае Python), было бы неплохо просто передать вспомогательные функции в код, сгенерированный для клиента. Или, если это не сработает, возможно, кто-то может порекомендовать лучший способ организовать мой код, чтобы я мог генерировать одни и те же вспомогательные функции как на клиенте, так и на сервере. Вроде обычная проблема.   -  person user2558918    schedule 18.05.2020


Ответы (1)


OpenApi позволит вам указывать только данные объекта, но не функции.

Чтобы совместно использовать общий код между клиентом и сервером, вы можете создать третий проект / модуль с общим кодом.

Затем используйте его как зависимость в своих клиент-серверных проектах.

─ myapp
   ├── client
   │   └── __init__.py
   ├── server
   │   └── __init__.py
   └── common
       └── __init__.py
person Gabriel Cappelli    schedule 24.05.2020