Quick Start#
Installation#
Install the package via pip
pip install flask-scheema
Model Definition#
To enable flask-scheema to automatically generate API endpoints, it’s necessary to provide a valid SQLAlchemy session and ensure it can interact with the models designated for API exposure.
This requirement is fulfilled by establishing a base class from which all relevant models will derive.
Additionally, integrating a method named get_session
is essential, as it will facilitate the retrieval of
a SQLAlchemy session.
Base Model
First you will need a base class that returns a session with a get_session
method.
When using flask-sqlalchemy, you can return db.session
in your base model.
from sqlalchemy.ext.declarative import declarative_base
class BaseModel(DeclarativeBase):
def get_session(*args):
return db.session
Database Models
Make sure any model you want to expose has a class attribute called Meta
with the following attributes:
tag
: The tag that will be used to identify the model in the API and documentation.tag_group
: The tag group that the model will be placed in in the API Documentation.
Don’t inherit from your base model, but from db.Model
as you normally would. When using Flask-SQLAlchemy,
you set the base model when initializing the extension, we will cover that shortly…
class Author(db.Model):
__table__ = "author"
class Meta:
tag = 'Author'
tag_group = "People/Companies"
...fields
When using sqlalchemy, you will have to create a session object and return this in your base model.
from sqlalchemy import create_engine
from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy.orm import sessionmaker
# Define the SQLite engine to use a local file-based database
engine = create_engine('sqlite:///example.db', echo=True)
# Generate a base class for your class definitions
Base = declarative_base()
# Create a Session class bound to the engine
Session = sessionmaker(bind=engine)
# Now you can create a session instance
session = Session()
class BaseModel(DeclarativeBase):
def get_session(*args):
return session
Make sure any model you want to expose inherits from the correct base, and has a class attribute Meta
with
the following attributes:
tag
: The tag that will be used to identify the model in the API and documentation.tag_group
: The tag group that the model will be placed in in the API Documentation.
class Author(BaseModel):
__table__ = "author"
class Meta:
tag = 'Author'
tag_group = "People/Companies"
...fields
Due to the default settings in flask-scheema
being set to Flask-SQLAlchemy’s db.session
, you will
have to set a Flask config of API_BASE_MODEL
with the name of your base model.
i.e
app.config['API_BASE_MODEL'] = 'BaseModel'
Extension Initialization#
To initialize the extension, it’s necessary to provide flask-scheema with a valid Flask application instance as with many other Flask extensions.
The only other requirement’s are a few configuration values that need to be passed to Flask’s config.
API_TITLE - The title of the API that will be displayed in the documentation.
API_VERSION - The version of the API that will be displayed in the documentation.
API_BASE_MODEL - This will either be
db.Model
if using Flask-SQLAlchemy or the name of your base model if using vanilla SQLAlchemy.
Notice below when you initialise Flask-SQLAlchemy you pass your BaseModel
as the model_clas
attribute,
but pass in db.model
to the Flask config as API_BASE_MODEL
.
Under the hood Flask-SQLAlchemy will use the model_class
to create the base model for all your models,
which then allows flask-scheema
to view and use the same base model to create the API endpoints.
from flask import Flask
from flask_sqlalchemy import SQLAlchemy
# Import your models
from models import Author
app = Flask(__name__)
db = SQLAlchemy(model_class=BaseModel)
scheema = Naan()
app.config['API_TITLE'] = 'My API
app.config['API_VERSION'] = '1.0'
app.config['API_BASE_MODEL'] = db.Model
from flask_scheema import Naan
with app.app_context():
db = db.init_app(app=app)
scheema.init_all(app)
if __name__ == '__main__':
app.run(debug=True)
Note
For comprehensive details on configuration, visit our configuration page.
And that’s all folks! Just run the code and you should now have a fully functional API with documentation.
When using SQLAlchemy you will have to set the API_BASE_MODEL in the Flask config.
from flask import Flask
# Import your models
from models import Author, BaseModel
app = Flask(__name__)
app.config['API_TITLE'] = 'My API
app.config['API_VERSION'] = '1.0'
app.config['API_BASE_MODEL'] = BaseModel
from flask_scheema import Naan
with app.app_context():
scheema = Naan(app)
if __name__ == '__main__':
app.run(debug=True)
Note
For comprehensive details on configuration, visit our configuration page.
And that’s all folks!
API Documentation#
You should now have a fully functional API with documentation.
GET
/docs
Queries#
Writing API calls is simple, and can be done in the following way:
GET
/api/author - returns a list of paginated authors.
GET
/api/author/1 - returns the author with the id of 1.
POST
/api/author - creates a new author.
PATCH
/api/author/1 - updates the author with the id of 1.
DELETE
/api/author/1 - deletes the author with the id of 1.
More advanced queries can be made by adding query parameters to the URL. This is fully documented in the API
documentation served at /docs
.
Full Example#
To see a full example of this code, please see the demo
directory in our repo or view the example - quickstart demo
For more indepth example flask application’s start with the basic factory application