Devido à imensa noobidade em relação ao Python em geral e ao Flask em particular, estou fundamentalmente confuso em relação às convenções, melhores práticas e know-how comum. Tento seguir os exemplos fornecidos pela Microsoft (já que estamos trabalhando com o Azure) e começo a suspeitar que eles podem ser... Microsoft'ish (ou seja, "funciona, mas...").
Com base em vários exemplos, criei dois endpoints, carregando a mesma computação, resultando em payloads equivalentes (não a mesma estrutura, no entanto!) e não consigo descobrir qual é a abordagem recomendada. Uma é usar recursos (junto com uma rota), enquanto a outra é roteamento explÃcito.
from flask import Flask
from flask_restful import Api, Resource, request
from logic import compute
app = Flask(__name__)
api = Api(app)
class computer (Resource):
def get(self):
return compute(request.args.to_dict())
api.add_resource(computer, "/compute-resource")
@app.route("/compute-route", methods=["GET"])
def execute():
return compute(request.args.to_dict())
if __name__ == "__main__":
app.run()
A única coisa (estranhamente inesperada) que notei na saÃda é que o último parece classificar os campos do JSON retornado em ordem alfabética, enquanto o primeiro não.
- Qual dessas duas abordagens é preferida ou são equivalentemente apropriadas?
- O que o desvio na ordenação dos campos sugere, se é que sugere alguma coisa?
Sua pergunta toca em um dilema comum ao projetar APIs Flask: se deve usar a abordagem baseada em Flask-RESTful
Resource
ou a abordagem baseada em rota do Flask . Ambas são válidas e têm seu lugar, dependendo do seu caso de uso e preferências.Principais diferenças
Frasco-RESTful (
Resource
):GET
,POST
,PUT
,DELETE
) usando métodos de classe.Exemplo:
Abordagem baseada em rotas (
@app.route
):jsonify
função (implicitamente usada pelo Flask@app.route
) classifica as chaves em ordem alfabética por padrão ao serializar para JSON.Exemplo:
Melhores Práticas
Quando usar Flask-RESTful:
Quando usar baseado em rota:
Seu Caso
Como ambos os métodos levam ao mesmo resultado e a única diferença é a ordem dos campos:
Sobre a ordenação de campos
O desvio na ordenação dos campos é devido a:
json
a biblioteca do Python diretamente, o que preserva a ordem de inserção dos dicionários.jsonify
, que é aplicadosort_keys=True
por padrão ao despejar JSON.Se você quiser controlar a ordenação dos campos na abordagem baseada em rotas, você pode desabilitar a classificação desta forma:
Recomendação
Para manutenibilidade e escalabilidade, especialmente ao trabalhar com Azure ou plataformas similares, adote Flask-RESTful com
Resource
. Ele se alinha com os padrões da REST API e mantém seu código organizado conforme o projeto cresce.