Skip to main content

Enhanced Flask-Smorest blueprints with automatic CRUD operations

Project description

Flask-More-Smorest

PyPI version Python Support Documentation Status License: MIT

Flask-More-Smorest extends Flask-Smorest with a number of enhancements and goodies, with the sole goal of drastically reducing boilerplate and complexity when creating a new REST API with Flask and Flask-Smorest.

Links:

Highlights

  • Automatic CRUD endpoints with filtering and pagination
  • SQLAlchemy base model with auto-generated Marshmallow schemas
  • Built-in user authentication with JWT and role-based permissions
  • UserBlueprint for instant login/profile endpoints
  • Resource-based permission management

Quick Start

from flask import Flask
from flask_more_smorest import BaseModel, CRUDBlueprint, init_db
from flask_more_smorest.perms import Api
from flask_more_smorest.sqla import db
from sqlalchemy.orm import Mapped, mapped_column

app = Flask(__name__)
app.config.update(
    API_TITLE="Example API",
    API_VERSION="v1",
    OPENAPI_VERSION="3.0.2",
    SQLALCHEMY_DATABASE_URI="sqlite:///example.db",
    SECRET_KEY="change-me",
    JWT_SECRET_KEY="change-me-too",
)

# Define your model
class Critter(BaseModel):
    name: Mapped[str] = mapped_column(db.String(100))
    species: Mapped[str] = mapped_column(db.String(50))
    cuteness_level: Mapped[int] = mapped_column(db.Integer, default=10)

init_db(app)          # sets up SQLAlchemy
api = Api(app)        # registers JWT + permission hooks

# Create CRUD blueprint using model class directly
critters = CRUDBlueprint(
    "critters",
    __name__,
    model=Critter,           # Use class (preferred over string)
    schema=Critter.Schema,   # Auto-generated schema
    url_prefix="/api/critters/",
)

api.register_blueprint(critters)

This automatically creates RESTful endpoints: GET /api/critters/, GET /api/critters/<id>, POST /api/critters/, PATCH /api/critters/<id>, DELETE /api/critters/<id>, plus automatic filtering (?created_at__from=..., ?species=...).

Controlling endpoints

By default, all CRUD methods are enabled. Control which endpoints are generated:

from flask_more_smorest.crud.crud_blueprint import CRUDMethod

# Enable only specific methods
read_only = CRUDBlueprint(
    "critters",
    __name__,
    model=Critter,
    schema=Critter.Schema,
    methods=[CRUDMethod.INDEX, CRUDMethod.GET],  # Only list and get
)

# Disable specific methods
no_delete = CRUDBlueprint(
    "critters",
    __name__,
    model=Critter,
    schema=Critter.Schema,
    skip_methods=[CRUDMethod.DELETE],  # All except delete
)

For advanced configuration (custom schemas, admin-only endpoints, etc.), see the full documentation.

Working with models

Use BaseModel to get UUID keys, timestamp tracking, and auto-generated Marshmallow schemas:

from flask_more_smorest import BaseModel
from flask_more_smorest.sqla import db
from sqlalchemy.orm import Mapped, mapped_column

class Critter(BaseModel):
    name: Mapped[str] = mapped_column(db.String(100), nullable=False)
    species: Mapped[str] = mapped_column(db.String(50), nullable=False)
    cuteness_level: Mapped[int] = mapped_column(db.Integer, default=10)

    def _can_write(self) -> bool:  # optional permission hook
        return self.is_current_user_admin()

Auto-generated schema: Critter.Schema is automatically created with all fields, plus is_writable for permission checking. Use it directly in blueprints—no need to define custom schemas unless you need special validation.

Built-in user authentication

Get instant authentication with UserBlueprint:

from flask_more_smorest import UserBlueprint

# Instant login and profile endpoints
user_bp = UserBlueprint()  # Creates /api/users/login/ and /api/users/me/
api.register_blueprint(user_bp)

This provides:

  • POST /api/users/login/ - JWT authentication
  • GET /api/users/me/ - Current user profile
  • Full CRUD for user management
  • Role-based permissions

Extending the User model

Add custom fields by inheriting from User:

from flask_more_smorest import User, UserBlueprint
from flask_more_smorest.sqla import db
from sqlalchemy.orm import Mapped, mapped_column

class Employee(User):
    employee_id: Mapped[str] = mapped_column(db.String(32), unique=True)
    department: Mapped[str] = mapped_column(db.String(100))

# Use custom user model in blueprint
employee_bp = UserBlueprint(model=Employee, schema=Employee.Schema)

Enable public registration

class PublicUser(User):
    PUBLIC_REGISTRATION = True  # Allow unauthenticated user creation

public_bp = UserBlueprint(model=PublicUser, schema=PublicUser.Schema)

Learn more

Contributing

Contributions and feedback are welcome! See CONTRIBUTING.md for guidelines.

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

flask_more_smorest-0.3.1.tar.gz (47.1 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

flask_more_smorest-0.3.1-py3-none-any.whl (52.1 kB view details)

Uploaded Python 3

File details

Details for the file flask_more_smorest-0.3.1.tar.gz.

File metadata

  • Download URL: flask_more_smorest-0.3.1.tar.gz
  • Upload date:
  • Size: 47.1 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.7

File hashes

Hashes for flask_more_smorest-0.3.1.tar.gz
Algorithm Hash digest
SHA256 10aca780ac3dcc11ab156f2d46ccb12a737a2a6ecb29e18c3409b4a057b6df99
MD5 1221cec4ad18fb9846e9cbaf9e64df83
BLAKE2b-256 d761a018b51b71792948c6e81243752951116b95c2e29210bb8e4ddc76f27ed9

See more details on using hashes here.

Provenance

The following attestation bundles were made for flask_more_smorest-0.3.1.tar.gz:

Publisher: ci-cd.yml on qualisero/flask-more-smorest

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file flask_more_smorest-0.3.1-py3-none-any.whl.

File metadata

File hashes

Hashes for flask_more_smorest-0.3.1-py3-none-any.whl
Algorithm Hash digest
SHA256 a65da466c3f8302eab3794f77b53acaa21de5d9a990a03567da014fd478a8914
MD5 c85feaa7ce1949502784c39e484da1d7
BLAKE2b-256 d645ad0a7b05ab641b02aae01a504a51e5480185aa6760104dc7cbad5c1fb8c9

See more details on using hashes here.

Provenance

The following attestation bundles were made for flask_more_smorest-0.3.1-py3-none-any.whl:

Publisher: ci-cd.yml on qualisero/flask-more-smorest

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page