Skip to main content
Pre-release

This release is a pre-release and may not be stable for production use.

Build Status Latest Version Supported Python versions License

Welcome to the Sanic Plugins Framework README file.

The Sanic Plugins Framework (SPF) is a lightweight python library aimed at making it as simple as possible to build plugins for the Sanic Async HTTP Server.

The SPF provides a SanicPlugin python base object that your plugin can build upon. It is set up with all of the basic functionality that the majority of Sanic Plugins will need.

A SPF Sanic Plugin is implemented in a similar way to Sanic Blueprints. You can use convenience decorators to set up all of the routes, middleware, exception handlers, and listeners your plugin uses in the same way you would a blueprint, and any Application developer can import your plugin and register it into their application.

The Sanic Plugins Framework is more than just a Blueprints-like system for Plugins. It provides an enhanced middleware system, and manages Context objects.

The Enhanced Middleware System

The Middleware system in the Sanic Plugins Framework both builds upon and extends the native Sanic middleware system. Rather than simply having two middleware queues (‘request’, and ‘response’), the middleware system in SPF uses four queues.

  • Request-Pre: These middleware run before the application’s own request middleware.

  • Request-Post: These middleware run after the application’s own request middleware.

  • Response-Pre: These middleware run before the application’s own response middleware.

  • Response-Post: These middleware run after the application’s own response middleware.

So as a plugin developer you can choose whether you need your middleware to be executed before or after the application’s own middleware.

You can also assign a priority to each of your plugin’s middleware so you can more precisely control the order in which your middleware is executed, especially when the application is using multiple plugins.

The Context Object Manager

One feature that many find missing from Sanic is a context object. SPF provides multiple context objects that can be used for different purposes.

  • A shared context: All plugins registered in the SPF have access to a shared, persistent context object, which anyone can read and write to.

  • A per-request context: All plugins get access to a shared temporary context object anyone can read and write to that is created at the start of a request, and deleted when a request is completed.

  • A per-plugin context: All plugins get their own private persistent context object that only that plugin can read and write to.

  • A per-plugin per-request context: All plugins get a temporary context object that is created at the start of a request, and deleted when a request is completed.

Installation

Install the extension with using pip, or easy_install.

$ pip install -U sanic-plugins-framework

Usage

A simple plugin written using the Sanic Plugins Framework will look like this:

# Source: my_plugin.py
from spf import SanicPlugin
from sanic.response import text

class MyPlugin(SanicPlugin):
    def __init__(self, *args, **kwargs):
        super(MyPlugin, self).__init__(*args, **kwargs)
        # do pre-registration plugin init here.
        # Note, context objects are not accessible here.

    def on_registered(self, context, reg, *args, **kwargs):
        # do post-registration plugin init here
        # We have access to our context and the shared context now.
        context.my_private_var = "Private variable"
        shared = c.shared
        shared.my_shared_var = "Shared variable"

my_plugin = MyPlugin()

# You don't need to add any parameters to @middleware, for default behaviour
# This is completely compatible with native Sanic middleware behaviour
@my_plugin.middleware
def my_middleware(request)
    h = request.headers
    #Do request middleware things here

#You can tune the middleware priority, and add a context param like this
#Priority must be between 0 and 9 (inclusive). 0 is highest priority, 9 the lowest.
#If you don't specify an 'attach_to' parameter, it is a 'request' middleware
@my_plugin.middleware(priority=6, with_context=True)
def my_middleware2(request, context):
    context['test1'] = "test"
    print("Hello world")

#Add attach_to='response' to make this a response middleware
@my_plugin.middleware(attach_to='response', with_context=True)
def my_middleware3(request, response, context):
    # Do response middleware here
    return response

#Add relative='pre' to make this a response middleware run _before_ the
#application's own response middleware
@my_plugin.middleware(attach_to='response', relative='pre', with_context=True)
def my_middleware4(request, response, context):
    # Do response middleware here
    return response

#Add your plugin routes here. You can even choose to have your context passed in to the route.
@my_plugin.route('/test_plugin', with_context=True)
def t1(request, context):
    words = context['test1']
    return text('from plugin! {}'.format(words))

The Application developer can use your plugin in their code like this:

# Source: app.py
from sanic import Sanic
from spf import SanicPluginFramework
from sanic.response import text
import my_plugin

app = Sanic(__name__)
spf = SanicPluginFramework(app)
spf.register_plugin(my_plugin)

# ... rest of user app here

Or if the developer prefers to do it the old way, (the Flask way), they can still do it like this:

# Source: app.py
from sanic import Sanic
from sanic.response import text
from my_plugin import MyPlugin

app = Sanic(__name__)
# this magically returns your previously initialized instance
# from your plugin module, if it is named `my_plugin` or `instance`.
reg = MyPlugin(app)

# ... rest of user app here

Contributing

Questions, comments or improvements? Please create an issue on Github

Credits

Ashley Sommer ashleysommer@gmail.com

Metadata

Release files for Sanic-Plugins-Framework 0.6.1.dev20180616

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

Source distribution (sdist)

Source distribution for Sanic-Plugins-Framework 0.6.1.dev20180616
File Size Uploaded
Sanic-Plugins-Framework-0.6.1.dev20180616.tar.gz 16.8 kB Details

Built distribution (wheel)

Table of built distributions (wheels) for Sanic-Plugins-Framework 0.6.1.dev20180616
File Interpreter ABI Platform
Sanic_Plugins_Framework-0.6.1.dev20180616-py2.py3-none-any.whl Python 3, Python 2 none any Details

Total release size: 32.2 kB

Release files / Sanic-Plugins-Framework-0.6.1.dev20180616.tar.gz

Download URL Sanic-Plugins-Framework-0.6.1.dev20180616.tar.gz
Size 16.8 kB
Tags Source
SHA-256 checksum
How to use checksums
c535bfc9ea8ee838fce37f3a28ea2d2fe54359a8d842e43c4e610b4319c5d837
BLAKE2b-256 checksum
How to use checksums
b5e4ac5aa2b83d203b6109c0152e64b6f5288ac0f6025fdd2471392a41c576be
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No

Release files / Sanic_Plugins_Framework-0.6.1.dev20180616-py2.py3-none-any.whl

Download URL Sanic_Plugins_Framework-0.6.1.dev20180616-py2.py3-none-any.whl
Size 15.3 kB
Tags Python 2 Python 3
SHA-256 checksum
How to use checksums
434b2703d9c55f8539d4efc86bafbad2915ff3197399a7f474c7d7fce988a383
BLAKE2b-256 checksum
How to use checksums
7ef943c4e5aadfa03612c7d1149a7ce50df6c04cabc4c882dcb8aa918bfcf230
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No

Release history Release notifications | RSS feed

0.9.5

2 release files

0.9.4

2 release files

0.9.3

2 release files

0.9.2

2 release files

0.9.1

2 release files

0.9.0

2 release files

0.8.2

2 release files

0.8.1

2 release files

0.8.0

2 release files

0.7.0

2 release files

0.6.7

2 release files

0.6.6

2 release files

0.6.5

2 release files

This release
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