Skip to main content
CI Status https://img.shields.io/pypi/v/more.next.svg https://img.shields.io/pypi/pyversions/more.next.svg

more.next: NextORM integration in Morepath

This package provides Morepath integration for the NextORM Object-Relational Mapper library.

This package binds the database session to the request so you can interact with the database in your App directly without using db_session.

Quick start

Install more.next:

$ pip install -U more.next

Extend your App class from NextApp:

from more.next import NextApp

class App(NextApp):
    pass

Create your model:

from nextorm import Database, Entity, Opt, PK

db = Database()


class Document(Entity):
    _table_ = 'document'

    id: PK[int]
    title: Opt[str]
    content: Opt[str]

    def update(self, payload={}):
        self.set(**payload)

    def remove(self):
        self.delete()

Setup the database in your start script:

import morepath

from .app import App
from .model import db


def run():
    db.bind("sqlite", "app.db")
    db.generate_mapping(create_tables=True)

    morepath.autoscan()
    morepath.run(App())

Now you can use the model in your path:

from .app import App
from .model import Document


@App.path(model=Document, path='documents/{id}')
def get_document(request, id=0):
    return Document[id]

And in your view:

from .app import App
from .model import Document


@App.json(model=Document)
def document_default(self, request):
    return {
        'id': self.id,
        'title': self.title,
        'content': self.content,
        'link': request.link(self)
    }


@App.json(model=Document, request_method='PUT')
def document_update(self, request):
    self.update(request.json)


@App.json(model=Document, request_method='DELETE')
def document_remove(self, request):
    self.remove()

Settings

You can set the arguments which are passed to db_session in the next section of your settings.

The default settings are:

@App.setting_section(section='next')
def get_next_settings():
    return {
        'allowed_exceptions': [],
        'immediate': False,
        'retry': 0,
        'retry_exceptions': [TransactionError],
        'serializable': False,
        'strict': False
    }

More information about the arguments you find in the NextORM API documentation.

You can also use the database settings section for your database setup, which allows you to use different setups for production, development and testing environments.

Just create create an App for each environment and load specific settings files:

class App(NextApp):
    pass

with open('settings/default.yml') as defaults:
  defaults_dict = yaml.load(defaults)

App.init_settings(defaults_dict)


class ProductionApp(App):
    pass


with open('settings/production.yml') as settings:
    settings_dict = yaml.load(settings)

ProductionApp.init_settings(settings_dict)


class TestApp(App):
    pass


with open('settings/test.yml') as settings:
    settings_dict = yaml.load(settings)

TestApp.init_settings(settings_dict)

The database configuration in the YAML settings files, depending on the database you use, could look something like:

database:
  provider: sqlite
  filename: app.db
  create_db: true

In your start script you setup the database and load the App according to the RUN_ENV environment variable:

import os
import morepath

from .app import App, ProductionApp, TestApp
from .model import db


def setup_db(app):
    db_params = app.settings.database.__dict__.copy()
    db.bind(**db_params)
    db.generate_mapping(create_tables=True)

def run():
  morepath.autoscan()

  if os.getenv('RUN_ENV') == 'production':
      ProductionApp.commit()
      app = ProductionApp()
  elif os.getenv('RUN_ENV') == 'test':
      TestApp.commit()
      app = TestApp()
  else:
      App.commit()
      app = App()

  setup_db(app)
  morepath.run(app)

Detail about the database configuration you find in the NextORM documentation.

Side effects

If you want to trigger side effects (like sending an email or writing to filesystem) on database commits you can emit a signal in the @request.after of the view which triggers the side effects.

Like this the side effects will be triggered just before the database session gets committed and only if it wasn’t rolled back.

This example uses more.emit:

@App.json(model=Document, request_method='PUT')
def document_update(self, request):
    self.update(request.json)

    @request.after
    def after(response):
        request.app.signal.emit('document_updated', self, request)

Altenatively you can use in your model the NextORM after_insert(), after_update() or after_delete() lifetime-hooks. This makes sure that the side effect is triggered after the database session has committed.

The drawback is that you don’t have easy access to the request or app in the model.

CHANGES

0.2.0 (2026-05-06)

  • Switch to src-layout.

  • Add pre-commit and tox environment for it.

0.1.2 (2026-04-16)

  • Add missing typings and declare more.next as typed package.

0.1.1 (2026-04-16)

  • Remove support for pypy3 and adjust configuration

  • Adjust allowed python version to minimum 3.12

0.1.0 (2026-04-15)

  • Initial release

Release files for more.next 0.2.0

For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.

Source distribution (sdist)

Source distribution for more.next 0.2.0
File Size Uploaded
more_next-0.2.0.tar.gz 9.1 kB Details

Built distribution (wheel)

Table of built distributions (wheels) for more.next 0.2.0
File Interpreter ABI Platform
more_next-0.2.0-py3-none-any.whl Python 3 none any Details

Total release size: 15.6 kB

Release files / more_next-0.2.0.tar.gz

Download URL more_next-0.2.0.tar.gz
Size 9.1 kB
Tags Source
SHA-256 checksum
How to use checksums
1d258acb160d5610feaa8b01a86ccbc363d7cb1b00c4e2ff6506b9ae20aef74d
BLAKE2b-256 checksum
How to use checksums
70a1d3dde975131be4db564367b4adf7a58323a875be03c264cb295326b7aaf0
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/6.2.0 CPython/3.13.5

Release files / more_next-0.2.0-py3-none-any.whl

Download URL more_next-0.2.0-py3-none-any.whl
Size 6.5 kB
Tags Python 3
SHA-256 checksum
How to use checksums
d5717fb413da41da125bdd7dbe088e2e07d987c3cc35e00b191f788ea177cb12
BLAKE2b-256 checksum
How to use checksums
42d8872e521e0c8d39d00fd7a58c8fdc9b002a1428021a16767e695e27fc1535
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/6.2.0 CPython/3.13.5

Release history Release notifications | RSS feed

This release

0.2.0 This release

2 release files

0.1.2

2 release files

0.1.1

2 release files

0.1.0

2 release files

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page