Empresas
Empregos
  • Sobre nós
  • Soluções
    • Publicação de vagas
      Publique sua vaga e receba candidatos qualificados em 48h.
    • Avaliações de candidatos
      Mais de 500 testes técnicos e psicológicos, mais anti-fraude.
    • Headhunting
      Busca executiva personalizada do início ao fim.
    • Folha de Pagamento + EOR
      Dispersão de folha e EOR em mais de 15 países da LATAM.
  • Preços
  • Empregos

0

252
Visualizações
How to speed up development of rest api in python?

i'm trying to create back-end app using FastApi and sqlAchemy. I have a lot of entities which has relations with database. So, my question is: How to speed up development? Now i write for each entity code:

@app.get("/holidays")
def getHolidays():
    session = Session(bind=engine)
    holidays: List[Holiday] = session.query(Holiday).all()
    return [x.to_json() for x in holidays]

@app.get("/exclusive_operations")
def getExclusiveOperations():
    session = Session(bind=engine)
    exclusive_operations: List[ExclusiveOperation] = session.query(ExclusiveOperation).all()
    return [x.to_json() for x in exclusive_operations]

@app.get('/category_descriptions')
def getCategoryDescr():
    session = Session(bind=engine)
    category_descrs: List[CategoryDescr] = session.query(CategoryDescr).all()
    return [x.to_json() for x in category_descrs]

So if i want to create all crud operations, i need to create 12 typical methods for 3 entities. Maybe another solution exists?

over 4 years ago · Santiago Trujillo
1 Respostas
Responde à pergunta

0

It is Python - as a dynamic language, the functions and methods are created at runtime. The "@app.get" decorator is what registers your views in the application, not their existence in the top level of a module.

Therefore, you can create a for loop that simply recreates and registers the view for each of your entities - it can be done either at the module level or inside a function.

(it is nice to have in mind that the "@xxxx" decorator syntax is just syntax sugar for calling the decorator passing the decorated function as its sole parameter)

for Entity, name in [(Holiday, "holidays"), (ExclusiveOperation, "exclusive_operations"), (CategoryDescr, "category_descriptions")]:
    def freeze_var_wrapper(Entity, name): 
        # this intermediary function is needed, otherwise the Entity and name
        # variables would be always up-to-date inside the view function
        # and always point to the last value in the external for-loop after
        # it finished execution:
        def view():
            session = Session(bind=engine)
            entities = session.query(Entity).all()
            return [x.to_json() for x in entities]
        # optional, may facilitate debugging:
        view.__name__ = f"get{Entity.__name__}s"
        # actually registers the view function with the framework:
        # (could be done in the same line, without the "view_registrer" var)
        view_registrer = app.get(f"/{name}")
        view_registrer(view)
    
    freeze_var_wrapper(Entity, name)

There are other ways of doing this that might remove the boiler-plate and look more elegant - for example with class inheritance and an apropriate __init__subclass__in a base class (even if the framework does not use "class views", we will register the bound method for each class, which is just a callable):


class BaseView:
    Entity: cls 
    view_name: str

    def __init_subclass__(cls, *args, **kw):
        super().__init_subclass__(*args, **kw)
        app.get(f"/{cls.view_name}")(cls.view)
        # above, cls.view is bound to the subclass being processed, therefore 
        # the class attributes as defined in each class body are used inside the method

        # this could easily register post, delete and detail views as well
        
    @classmethod
    def view(cls);
        session = Session(bind=engine)
        entities = session.query(cls.Entity).all()
        return [x.to_json() for x in entities]
    
class HolydayView(BaseView):
    Entity = Holyday
    view_name = "holydays"
    # thats is just it.

class ExclusiveOperationView(BaseView):
    Entity = ExclusiveOperation
    view_name = "exclusive_operations"
    
class CatewgoryDescriptionView(BaseView):
    Entity = CategoryDescription
    view_name = "category_descriptions"
over 4 years ago · Santiago Trujillo Relatório
Responde à pergunta
Encontrar trabalhos remotos

Descubra a nova forma de encontrar um emprego!

melhores empregos
Principais categorias de trabalho
Empresas
Postar vaga Preços Comercial
Jurídico
Termos e Condições Política de privacidade
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Recomende algumas ofertas para mim
Preciso de ajuda