web framework based on Asyncio stack
Project description
The Muffin
The framework has been created in 2015 when asyncio/aiohttp stack was very young and small. It was an attempt to build a foundation for asyncio web based project with all required tools (plugins system, admin interfaces, REST API and etc). For current moment (2018) aiohttp stack is quite good and the Muffin is depricated. It can be supported because some projects still use it but if you are planning to start a new project I would recomend to have a look on something else.
The Muffin – A web framework based on Asyncio stack (depricated) Muffin is a fast, simple and asyncronous web-framework for Python 3.
Docs are available at https://muffin.readthedocs.org/. Pull requests with documentation enhancements and/or fixes are awesome and most welcome.
Example “Hello User” with the Muffin:
import muffin
app = muffin.Application('example')
@app.register('/', '/hello/{name}')
def hello(request):
name = request.match_info.get('name', 'anonymous')
return 'Hello %s!' % name
if __name__ == '__main__':
app.manage()
Save the script as example.py and run it:
$ python3 example.py run
Open http://localhost:5000, http://localhost:5000/hello/username in your browser. Enjoy!
Plugins
The list of some Muffin plugins (please make PR if you want to provide more):
Muffin-Admin – Basic Admin interface
Muffin-Babel – Localization support
Muffin-DebugToolbar – Debug Toolbar
Muffin-Jade – Jade templates
Muffin-Jinja2 – Jinja2 templates
Muffin-Metrics – Send metrics to Graphite/Statsd
Muffin-Mongo – MongoDB (pymongo) support
Muffin-Motor – MongoDB (motor) support
Muffin-OAuth – OAuth client
Muffin-Peewee – Peewee support (SQL, ORM)
Muffin-REST – Helpers for building REST API
Muffin-Redis – Redis support
Muffin-Sentry – Sentry integration
Muffin-Session – User session (auth)
Requirements
python >= 3.5.3
Benchmarks
You could find some tests here: http://klen.github.io/py-frameworks-bench/
Installation
The Muffin should be installed using pip:
pip install muffin
Usage
See more in the example application sources. The application is deployed on Heroku: https://muffin-py.herokuapp.com
Run example server locally:
$ make -C example run
And open http://fuf.me:5000 in your browser.
Configuration
Muffin gets configuration options from python files. You have to specify default configuration module name in your app initialization:
app = muffin.Application('myapp', CONFIG='config.debug')
This name could be overriden by MUFFIN_CONFIG environment variable:
$ MUFFIN_CONFIG=settings_local muffin example run
Which in its turn could be overriden by --config param of muffin command:
$ muffin --config=config.debug example run
Also you can define default config parameter values while initializing your application:
app = muffin.Application('myapp', DEBUG=True, ANY_OPTION='Here', ONE_MORE='Yes')
Base application options
Base Muffin options and default values:
# Configuration module
'CONFIG': 'config'
# Enable debug mode
'DEBUG': ...
# Logging options
'ACCESS_LOG': '-', # File path to access log, - to stderr
'ACCESS_LOG_FORMAT': '%a %l %u %t "%r" %s %b "%{Referrer}i" "%{User-Agent}i"',
'LOG_LEVEL': 'WARNING'
'LOG_FORMAT': '%(asctime)s [%(process)d] [%(levelname)s] %(message)s'
'LOG_DATE_FORMAT': '[%Y-%m-%d %H:%M:%S %z]'
# Setup static files in development
'STATIC_PREFIX': '/static'
'STATIC_FOLDERS': ['static']
Configuring logging
You can define your logging configurations with Python dictConfig format and place in LOGGING conf:
LOGGING = {
'version': 1,
'disable_existing_loggers': False,
'formatters': {
'default': {
'format': '%(asctime)s %(levelname)s %(name)s %(message)s'
},
},
'handlers': {
'logfile': {
'level': 'DEBUG',
'class': 'logging.handlers.RotatingFileHandler',
'filename': 'my_log.log',
'maxBytes': 50 * 1024 * 1024,
'backupCount': 10
},
},
'loggers': {
'': {
'handlers': ['logfile'],
'level': 'ERROR'
},
'project': {
'level': 'INFO',
'propagate': True,
},
}
}
To use just get logger with logging.getLogger():
import logging
logger = logging.getLogger('project')
CLI integration
Run in your shell:
$ muffin path.to.your.module:app_object_name --help
Write a custom command
@app.manage.command
def hello(name, upper=False):
""" Write command help text here.
:param name: Write your name
:param upper: Use uppercase
"""
greetings = 'Hello %s!' % name
if upper:
greetings = greetings.upper()
print(greetings)
$ muffin example hello --help Write command help text here. positional arguments: name Write your name optional arguments: -h, --help show this help message and exit --upper Enable use uppercase --no-upper Disable use uppercase $ muffin example hello mike --upper HELLO MIKE!
Testing
Setup tests
Set module path to your Muffin Application in pytest configuration file or use command line option --muffin-app.
Example:
$ py.test -xs --muffin-app example
Testing application
See examples:
async def test_async_code():
async def coro():
return True
assert await coro()
def test_app(app):
""" Get your app in your tests as fixture. """
assert app.name == 'my app name'
assert app.cfg.MYOPTION == 'develop'
async def test_view(client):
""" Make HTTP request to your application. """
async with client.get('/my-handler') as resp:
text = await resp.text()
assert 'mydata' in text
Also please check aiohttp testing documentation.
Deployment
Use muffin command. By example:
$ muffin example run --workers=4
See muffin {APP} run --help for more info.
Bug tracker
If you have any suggestions, bug reports or annoyances please report them to the issue tracker at https://github.com/klen/muffin/issues
Contributing
Development of The Muffin happens at: https://github.com/klen/muffin
Contributors
License
Licensed under a MIT license (See LICENSE)
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
File details
Details for the file muffin-0.31.0.tar.gz
.
File metadata
- Download URL: muffin-0.31.0.tar.gz
- Upload date:
- Size: 21.6 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/1.12.1 pkginfo/1.4.2 requests/2.19.1 setuptools/40.4.3 requests-toolbelt/0.8.0 tqdm/4.27.0 CPython/3.6.3
File hashes
Algorithm | Hash digest | |
---|---|---|
SHA256 | 15c2150f281f40cfc7d9abe37aafe4aba7a69f1d2dc2c4cc939ddb8a64f27bc6 |
|
MD5 | 87accf5e4e8f898bf1f63b0090238ab2 |
|
BLAKE2b-256 | 3d0cec95129e207530ae3b5f67d8bb22759d523e02a0975d2f91d27368f29752 |
File details
Details for the file muffin-0.31.0-py3-none-any.whl
.
File metadata
- Download URL: muffin-0.31.0-py3-none-any.whl
- Upload date:
- Size: 21.0 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/1.12.1 pkginfo/1.4.2 requests/2.19.1 setuptools/40.4.3 requests-toolbelt/0.8.0 tqdm/4.27.0 CPython/3.6.3
File hashes
Algorithm | Hash digest | |
---|---|---|
SHA256 | 7c7cbeeb9918608052393346f323031069a152ecdf68f846a267754080f6ef57 |
|
MD5 | 657d00a0372e31d23c0d82ad555ea188 |
|
BLAKE2b-256 | 88e604b3d1d1850926690ba1a4e7c4c308dca047aeddc22f8b74cd72ea44f640 |