Bazuca ou Canivete?
Django ou Flask?
About me

- Tyrone Damasceno
- Potiguar (de Natal/RN)
- Desenvolvedor Python
- Ex competidor de maratona de programação
- Apaixonado por comunidade
- Burger&Beer



NÃO SÃO OS ÚNICOS!!!

Django
& django rest framework
- Super produtividade (quando se aprende)
- Entrega tudo na sua mão
- Padrão MTV (parece com o MVC)
- "Ideal" para projetos grandes
- Django ORM, Django admin, Django templates, Django forms, Django auth... Django life
- Django Rest Framework que é outra lib/framework "em cima" do django, agiliza muito o desenvolvimento de APIs REST
Flask
- Microframework
- Curva de aprendizado baixissima
- Simplicidade, extensibilidade
- Entrega o básico (mas tem um ecossistema completo a um pip install de distância)
- Você que decide o padrão, mas geralmente usa-se o MVC
- "Ideal" para projetos menores
- Ótima integração com NoSQL
- Mais praticidade para customização (veremos hoje)
Primeiras diferenças


Conversou besteira demais já
- Uma API Rest em Django e em Flask
- O tema é uma agenda de contatos
- Será possível cadastrar um contato, com telefone, email, telegram, github e twitter
- Então, vamo simbora!
O que faremos?
Como definir rotas?
from flask_restful import Api
api = Api(app)
from flaskapi.flaskapi import resources
api.add_resource(resources.Home, '/')
api.add_resource(resources.Login, '/login')
api.add_resource(resources.User, '/user')
api.add_resource(resources.Deposit, '/deposit')
api.add_resource(resources.Withdraw, '/withdraw')
api.add_resource(resources.Transfer, '/transfer')
api.add_resource(resources.Statements, '/statements')

from django.urls import path, include
from rest_framework import routers
router = routers.DefaultRouter()
router.register('user_register', views.UserViewSet, base_name='user_register')
router.register('user', views.ProtectedUserViewSet, base_name='user')
router.register('login', views.LoginViewSet, base_name='login')
router.register('operations', views.OperationsViewSet, base_name='operations')
urlpatterns = [
path('', include(router.urls))
]

E os modelos?
class User(db.Model, BaseModel):
id = db.Column(db.Integer, primary_key=True)
email = db.Column(db.String(100), nullable=False)
password = db.Column(db.String(100), nullable=False)
doc_number = db.Column(db.String(100), nullable=False)
balance = db.Column(db.Float, default=0.0)
is_active = db.Column(db.Boolean, default=True)
transactions = db.relationship('Transaction', backref='owner')
class Transaction(db.Model, BaseModel):
id = db.Column(db.Integer, primary_key=True)
timestamp = db.Column(db.DateTime, default=datetime.utcnow)
value = db.Column(db.Float, nullable=False)
user_id = db.Column(db.Integer, db.ForeignKey('user.id'))
class User(PermissionsMixin, AbstractBaseUser):
email = models.EmailField(unique=True)
doc_number = models.CharField(max_length=100)
balance = models.FloatField(default=0.0)
is_staff = models.BooleanField(default=False)
is_active = models.BooleanField(default=True)
class Transaction(models.Model):
timestamp = models.DateTimeField(default=datetime.now)
value = models.FloatField()
user = models.ForeignKey(User, on_delete=models.CASCADE)


What about SECURITY?



@jwt_required
def get(self):
user = _get_current_user()
if not user:
return {'message': 'User not found'}, 404
return {'message': 'Success', 'data': user.to_dict()}, 200
class UserViewSet(mixins.RetrieveModelMixin, viewsets.GenericViewSet):
queryset = User.objects.all()
serializer_class = UserSerializer
authentication_classes = (TokenAuthentication, )
permission_classes = (IsAuthenticated, )



from flask_sqlalchemy import SQLAlchemy
app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:///my.db'
db = SQLAlchemy(app)


Como conectar com um banco?
Flask
Django
O django possui uma ORM própria bastante poderosa e bem completa.

O flask tem extensões que trabalham junto da ORM SQLalchemy que é fantástica.
E como manipular os dados?

Questions?
Temos um veredito?
Bazuca ou Canivete?
By Tyrone Damasceno
Bazuca ou Canivete?
- 138