Api Rest com Python
# Introdução
Para iniciar o desenvolvimento da api com python utilizando flask é preciso verificar se você possui Python e pip(“gerenciador de pacotes do python”) instalado na máquina e para isso é preciso acessar o terminal e digitar (“python - -version”) e (“pip - -version”) como na imagem abaixo.
Caso não tenha instalado o python acesse https://www.python.org/downloads/ e faça a instalação do python. Caso não tenha pip instalado acesse https://pip.pypa.io/en/stable/installing/ e faça a instalação do pip. É preciso tambem ter o git instalado em sua máquina, para isso acesse https://git-scm.com/ e faça download e instalação do mesmo.
Feito isso agora partiremos para criação do ambiente de desenvolvimento.
# Configurando Ambiente de Desenvolvimento
A IDE de desenvolvimento que irei utilizar hoje será o Visual Studio code que você pode encontrar aqui https://code.visualstudio.com/. Após fazer o download é só fazer a instalação que é muito simples e não nos aprofundaremos nesse artigo, mais caso queira saber mais acesse https://code.visualstudio.com/docs.

# Clonando Projeto
Para acelerar o nosso desenvolvimento iremos clonar um projeto de minha autoria que está disponivel em https://github.com/raultocantins/flask_python.git, para isso crie uma pasta em qualquer local e acesse ela com o terminal(“exemplo cmd”).
Com o terminal aberto iremos clonar o projeto utlizando o git, para isso digite (“git clone https://github.com/raultocantins/flask_python.git") e após termina o processo de clonagem de repósitorio acesse a nova pasta com (“cd flask_python”), agora digite (” code . “) e aguarde o VisualStudioCode abrir no diretorio atual.
Para que tudo funcione bem precisaremos instalar as dependências que o projeto utiliza com exemplo pymongo, flask, bcrypt e para isso acesse o terminal integrado do vscode na aba Terminal > New Terminal, com o terminal aberto digite (“pip install”) o pip se encarregará de instalar todas as dependências do projeto.
No arquivo “server.py” no trecho de código abaixo altere o USER e PASSWORD com seu login do mongodb, e em DATABASE o nome do seu banco de dados.
app.config['MONGO_URI'] = "mongodb+srv://<USER>:<PASSWORD>@cluster0.ebc1x.mongodb.net/<DATABASE>?retryWrites=true&w=majority"
#Lembrando que estou utilizando o atlas cloud do mongodb mais você poderá utilizar o mongodb local.
Após a alteração da conexão com o banco de dados teste o server digitando (“python server.py”) e acesse localhost:4001 em seu navegador, caso sua página fique como a imagem abaixo então o server está funcionando perfeitamente.

#Caso tenha dado tudo certo partiremos agora para o código :)
# Código
Na primeira parte do código estamos importando os módulos que serão utilizados pela nossa aplicação
# importando flask para criação da api
from flask import Flask, json, jsonify, request
import pymongo
from flask_pymongo import PyMongo
from bson.json_util import dumps
from bson.objectid import ObjectId
from werkzeug.security import generate_password_hash, check_password_hash
import hmac
import hashlib
import base64
import json
import datetime
from flask_cors import CORS
#note que importei flask, pymongo que de fato serão os mais importantes para levantar o server e fazer conexão com o banco de dados.
Nessa parte estamos instânciando o nosso server flask e criando todas as rotas do nosso servidor REST.
#Não se esqueça de configurar url de conexão do mongoDB :)
# Criando uma instância do flask
app = Flask(__name__)
CORS(app)
app.secret_key = "secretKey"
app.config['MONGO_URI'] = "mongodb+srv://<USER>:<PASSWORD>@cluster0.ebc1x.mongodb.net/<DATABASE>?retryWrites=true&w=majority"
mongo = PyMongo(app)
app.static_folder = '.'
# Criando rota estática para index.html
@app.route('/', methods=['GET'])
def index():
return app.send_static_file('index.html')
# Criando rota para adicionar usuário.
@app.route('/add', methods=['POST'])
def set_users():
_json = request.json
_name = _json['name']
_email = _json['email']
_password = _json['password']
if _name and _email and _password and request.method == 'POST':
_hashed_password = generate_password_hash(_password)
id = mongo.db.user.insert_one({'name': _name, 'email': _email, 'pwd': _hashed_password})
resp=jsonify("Usuário adicionado com sucesso!")
resp.status_code = 200
return resp
else:
return not_found()
#rota de erro 404
@app.errorhandler(404)
def not_found(error=None):
message = {
'status': 404,
'message': "Not found"+request.url
}
resp = jsonify(message)
resp.status_code = 404
return resp
# Criando rota para buscar todos os usuários cadastrados.
@app.route('/users', methods=['GET'])
def get_users():
users=mongo.db.user.find()
resp=dumps(users)
return resp
#Rota para buscar usuário pelo id.
@app.route('/user/<id>')
def user(id):
user=mongo.db.user.find_one({'_id':ObjectId(id)})
resp=dumps(user)
return resp
#Rota para deletar usuário pelo id.
@app.route('/user/<id>',methods=['DELETE'])
def delete_user(id):
mongo.db.user.delete_one({'_id':ObjectId(id)})
resp=jsonify("Usuário removido com sucesso.")
resp.status_code=200
return resp
#Rota para alterar usuário pelo id.
@app.route('/user/<id>',methods=['PUT'])
def update_user(id):
_id=id
_json=request.json
_name=_json['name']
_email=_json['email']
_password=_json['password']
if _name and _email and _password and request.method=='PUT':
_hashed_password=generate_password_hash(_password)
mongo.db.user.update_one({'_id':ObjectId(_id['$oid']) if '$oid' in _id else ObjectId(_id)},{'$set':{'name':_name,'email':_email,'pwd':_hashed_password}})
resp=jsonify("Usuário atualizado com sucesso.")
resp.status_code=200
return resp
else:
return not_found()
#Rota de signin da api, validando user e retornando token
@app.route('/signin',methods=['POST'])
def signin():
print(request)
_json = request.json
_email = _json['email']
_password = _json['password']
if _email and _password and request.method == 'POST':
id=mongo.db.user.find_one({"email":_email})
if id:
check=check_password_hash(id["pwd"] , _password )
else:
return jsonify("Usuario não cadastrado.")
if check:
payload = {
'userId':str(ObjectId(id['_id'])),
'name':str(id['name']),
'email':id['email'],
'exp': (datetime.datetime.now() + datetime.timedelta(minutes=30)).timestamp(),}
jwt_created = create_jwt(payload)
resp={"token":jwt_created}
return resp
else:
return jsonify("Email/Password inválidos.")
#rota para validação do token
@app.route('/validate',methods=['POST'])
def validate():
_json=request.json
_token=_json['token']
if _token and request.method=="POST":
decoded_jwt = verify_and_decode_jwt(_token)
if decoded_jwt:
return decoded_jwt
else:
return not_found()
E por último para que nosso servidor rode 100% definimos o host e a porta da aplicação.
if __name__ == '__main__':
# Definindo host e porta para instância do flask
app.run(host='0.0.0.0', port=4001, debug=True)
# Rodando o server
#Testando Api
Para testarmos a api rest com python você poderá utilizar um app do google chrome chamado de “Talend API Tester” para realizar requisições na api e para isso acesse google apps e faça o download e instalação.
Após realizar a instalação abra o Talend API Tester e antes de testar as rotas não se esqueça de rodar o servidor com “python server.py” feito isso partiu testar api…..