Recuperando argumentos da URL em uma aplicação Flask. (Python)
Overview
Bem-vindos a um tutorial onde desvendaremos o universo do Flask, focando em uma habilidade essencial: recuperar argumentos passados no corpo da URL e através da querystring. Projetado para ser leve e direto ao ponto, este post promete equipá-lo com o conhecimento necessário para manipular dados com facilidade em suas aplicações web. Se você é um entusiasta do Flask ou alguém procurando aprimorar suas habilidades, está no lugar certo!
Neste post mostro como recuperar argumentos passados tanto no corpo da url quanto via querystring.
A primeira coisa que vamos precisar para este exemplo é ter o Flask instalado e uma instância dele.
Para instalar, basta utilizar o PIP:
pip install flask
Para gerar a instancia do Flask:
from flask import Flask, jsonify, request
app = Flask(__name__)
Agora vamos aos exemplos práticos…
Recuperando um argumento numérico (integer) do corpo da URL
@app.route("/users/<int:id>/edit", methods=["GET"])
def route_edit_user(id):
msg = "You want to edit the user with ID: {} | Arg type: {}".format(id, type(id))
print(msg)
return jsonify(msg)
Se você já está acostumado a trabalhar com Flask, percebeu que o código é bem parecido com o “normal”, com duas diferenças:
- No parâmetro de definição da rota foi incluído o parâmetro <int:id> e ele indica que um argumento do tipo integer (int) e com o nome id será passado nesta posição.
- Na definição do método route_edit_user foi definido também um argumento com nome Id. Este nome não é aleatório. Ele corresponde ao nome que foi informado no passo anterior (definição da rota).
Exemplo de request utilizando cURL:
curl http://localhost:5000/users/10/edit
Resultado: “You want to edit the user with ID: 10 | Arg type: <class “int”>”
Recuperando argumentos string do corpo da URL
@app.route("/order/from/<string:order_from>/to/<string:order_to>", methods=["GET"])
def route_get_orders_by_location(order_from, order_to):
msg = "You want to see the orders from {} to {}... | Arg type: order_from: {} | order_to: {}".format(
order_from.upper(), order_to.upper(), type(order_from), type(order_to))
print(msg)
return jsonify(msg)
Neste método, a lógica aplicada foi a mesma. Todavia, inclui dois argumentos na url: order_from e order_to. Ambos strings.
Exemplo de request utilizando cURL:
curl http://localhost:5000/order/from/New%20York/to/West%20Virginia
Resultado: “You want to see the orders from NEW YORK to WEST VIRGINIA… | Arg type: order_from: <class “str”> | order_to: <class “str”>”
Recuperando argumentos do tipo float (double) do corpo da URL
@app.route("/double/<float:double_this>", methods=["GET"])
def route_double(double_this):
msg = "You want double {}... which is {}... | Arg type: {}".format(double_this, double_this*2, type(double_this))
print(msg)
return jsonify(msg)
Novamente, a mesma lógica foi utilizada.
Exemplo de request utilizando cURL:
curl http://localhost:5000/double/20.5
Resultado: “You want double 20.5… which is 41.0… | Arg type: <class “float”>”
Recuperando argumentos da querystring
@app.route("/querystring", methods=["GET"])
def route_query_string():
msg = "You passed {} args using query string. Your args: {}".format(len(request.args), request.args)
print(msg)
return jsonify(msg)
A lógica aqui é um pouco diferente. Desta vez não estou incluindo argumentos no corpo da URL, mas passando eles via query string.
Eles podem ser recuperados utilizando a propriedade args do objeto request. Ele é um ImmutableDict com todos os argumentos que foram passados. Sendo assim, você consegue trata-lo como se fosse um dicionário normal, só não será possível modifica-lo.
Exemplo de request utilizando cURL:
curl -L "http://localhost:5000/querystring?a=1&b=Bacon&c=Hey%20yo!"
Resultado: “You passed 3 args using query string. Your args: ImmutableMultiDict([(“a”, “1”), (“b”, “Bacon”), (“c”, “Hey yo!”)])”
Para quem quiser um exemplo relacionado a este post, coloquei o código no meu Github.
Espero ter ajudado!