Série API em Flask - Parte 11 - Deletando um usuário
Chegando ao fim de nosso CRUD vamos implementar a deleção de usuaŕios. Aqui eu escolhi fazer um soft delete
ou seja re-utilizei o campo active
setando-o como False
para indicar que meu usuário foi deletado. A outra maneira seria de fato deletar o usuário da nossa base utilizando o método User.objects.get(id=user_id).delete()
, porém não quero perder dados. E claro para recuperar esse usuário basta ativá-lo novamente.
Para entendimento, segue os capítulos que serão abordados.
Capítulo 1: Introdução, configuração e Hello World
Capítulo 2: Organizando as dependências e requerimentos
Capítulo 3: Configurando o pytest e nosso primeiro teste
Capítulo 4: Configurando o Makefile
Capítulo 5: Adicionando o MongoDB
Capítulo 6: Criando e testando o modelo de usuários
Capítulo 7: Criando usuários
Capítulo 8: Listando usuários
Capítulo 9: Buscando usuários
Capítulo 10: Editando um usuário
Capítulo 11: Deletando um usuário Estamos aqui
Capítulo 12: Autênticação por JWT
Capítulo 13: Criando um container Docker
Capítulo 14: Arquivos de configuração para Deploy na Digital Ocean
Capítulo 15: Automatizando o processo de deploy com Fabric
Capítulo 16: CI e CD com Jenkins, Python, Flask e Fabric
Capítulo 17: Utilizando o RabbitMQ com Flask e Sendgrid para enviar e-mails de boas vindas e ativar a conta do usuário
O repositório com todo o código fonte esta aqui. Os capítulos estão em branches
.
Criar uma nova mensagem
Como de praxe, precisamos padronizar as mensagens da aplicação. Para este caso vamos criar uma mensagem referenciando à um recurso atualizado. Em nosso messages.py
adicione:
MSG_RESOURCE_DELETED = '{} deletado(a).'
O método DELETE
Esse é um dos recursos mais simples de nosso CRUD.
# -*- coding: utf-8 -*-
# Flask
from flask import request
# Third
from flask_restful import Resource
from mongoengine.errors import FieldDoesNotExist
from mongoengine.errors import NotUniqueError, ValidationError
# Apps
from apps.responses import resp_ok, resp_exception, resp_data_invalid, resp_already_exists
from apps.messages import MSG_RESOURCE_FETCHED_PAGINATED, MSG_RESOURCE_FETCHED
from apps.messages import MSG_NO_DATA, MSG_RESOURCE_UPDATED, MSG_INVALID_DATA
from apps.messages import MSG_ALREADY_EXISTS, MSG_RESOURCE_DELETED
# Local
from .models import User
from .schemas import UserSchema, UserUpdateSchema
from .utils import get_user_by_id, exists_email_in_users
class AdminUserPageList(Resource):
# ...
class AdminUserResource(Resource):
def get(self, user_id):
# ...
def put(self, user_id):
# ...
def delete(self, user_id):
# Busco o usuário na coleção users pelo seu id
user = get_user_by_id(user_id)
# se não for uma instancia do modelo User retorno uma resposta
# da requisição http do flask
if not isinstance(user, User):
return user
try:
user.active = False
user.save()
except NotUniqueError:
return resp_already_exists('Users', 'usuário')
except ValidationError as e:
return resp_exception('Users', msg=MSG_INVALID_DATA, description=e.__str__())
except Exception as e:
return resp_exception('Users', description=e.__str__())
return resp_ok('Users', MSG_RESOURCE_DELETED.format('Usuário'))
Testando
$ http -v DELETE 0.0.0.0:5000/admin/users/5bbeaf52fb5d1b0a32466c93
DELETE /admin/users/5bbeaf52fb5d1b0a32466c93 HTTP/1.1
Accept: */*
Accept-Encoding: gzip, deflate
Connection: keep-alive
Content-Length: 0
Host: 0.0.0.0:5000
User-Agent: HTTPie/0.9.8
HTTP/1.0 200 OK
Content-Length: 87
Content-Type: application/json
Date: Wed, 17 Oct 2018 18:56:50 GMT
Server: Werkzeug/0.14.1 Python/3.6.5
{
"message": "Usuário deletado(a).",
"resource": "Users",
"status": 200
}
Graças a refatoração de código podemos economizar algumas linhas de código. Com isso finalizamos a atualização de dados do usuário e estamos quase terminando o nosso CRUD.
Próximo artigo: Autênticação por JWT