4

I am developing a CRUD application using vue.js and vuetify as frontend (view) and python flask-resplus and sqlAlchemy as backend (controler and model).

app/main/model/person.py

from sqlalchemy import Column, Integer, String, Date
from app.main.repository.base_repository import Base

    class Person(Base):
        __tablename__ = 'person'

        id = Column(Integer, primary_key=True)
        name = Column(String)
        date_of_birth = Column(Date)

        def __init__(self, name=None, date_of_birth=None):
            if name is not None:
                self.name = name
            if date_of_birth is not None:
                self.date_of_birth = date_of_birth

app/main/controller/person_controller.py

from flask_restplus import Namespace, fields, Resource, cors
from flask import request
from app.main.service.person_service import PersonService
from app.main.model.person import Person

api = Namespace('persons', description='Person related operations')

persServ : PersonService = PersonService()

model = api.model('Person', {
    'id': fields.Integer,
    'name': fields.String,
    'date_of_birth': fields.Date
})

@api.route("/persons/all")
class PersonList(Resource):
    @api.marshal_with(model)
    def get(self, **kwargs):
        return persServ.get_persons()
        # return Person(name="Test", date_of_birth=date(1984, 10, 20))

@api.route("/person/<int:id>")
class PersonReturn(Resource):
    @api.marshal_with(model)
    def get(self, id):
        return persServ.get_person(id)

@api.route("/person/<int:id>")
class PersonUpdate(Resource):
    @api.marshal_with(model)
    def put(self, id):
        data = request.json
        #TODO marshalling currently still error
        return persServ.update_person(pers=data)

@api.route("/person")
class PersonCreate(Resource):
    @api.marshal_with(model)
    def post(self):
        data = request.json
        #TODO: check why person is not correctly linked to sql alchemy when reated here, make sure that model.Person is created
        # pers = Person()
        # pers.name = data['name']
        # persServ.create_person(pers)
        return persServ.create_person_02(data['name'])

@api.route("/person/<int:id>")
class PersonDelete(Resource):
    def delete(self, id):
        persServ.delete_person(id)
        return '', 204

Questions also after implementing a spring java backend :

1) Is it necessary to provide an api.model in person_controller.py or can I annotate properties in person.py? Could you kindly guide me to a tutorial annotating an existing object?

2) Naming conventions flask api classes: In my eyes it definitely makes sense to use PersonList and Person instead of PersonUpdate, PersonCreate to ease API documentation as described in the flask-resPlus full example: https://flask-restplus.readthedocs.io/en/stable/example.html However, I already have an existing Person class in person.py. I am thinking about having two person classes, a Person(Resource) in person_controller.py for Post, Put and Get operations and a Person in person.py as domain specific person object. However, I do not want to cause confusion and adhere to naming and orgainization good practices. What is the suggested naming approach? Is there a good example tutorial?

wuz
  • 483
  • 3
  • 16
  • 1
    flask_restplus requires that you define `api.model`'s for documentation, type definition, input serialization and output marshaling.. There's no integration to use SQL Alchemy models (or models from any other framework) to define `api.model`'s. – John Aug 13 '19 at 04:16
  • Check out this package that does what you're asking for: https://pypi.org/project/flask-restplus-sqlalchemy/ – Sean McCarthy Nov 26 '20 at 02:23

0 Answers0