Onion Hack

Aprendendo para Ensinar :)

15 Oct 2020

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.

vscode

# 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.

localhost:4001

#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…..