A very micro HTTP framework.
- Very simple, less-code & fast
- Using object dispatcher instead of regex route dispatcher.
- Url-Encoded & Multipart form parsing.
- No
request
and orresponse
objects is available, everything is combined innanohttp.context
. - You can use maryjane to observe the changes in your project directory and reload the development server if desired.
- A very flexible configuration system: pymlconf
The road map is to keep it simple with 100% code coverage. no built-in template engine and or ORM will be included.
$ pip install --pre nanohttp
$ cd path/to/nanohttp
$ pip install -e .
demo.py
from os.path import dirname, abspath
from nanohttp import Controller, html, context, Static, HttpFound, settings
class Root(Controller):
static = Static(abspath(dirname(__file__)))
@html
def index(self):
yield '<html><head><title>nanohttp demo</title></head><body>'
yield '<h1>nanohttp demo page</h1>'
yield '<h2>debug flag is: %s</h2>' % settings.debug
yield '<img src="/static/cat.jpg" />'
yield '<ul>'
yield from ('<li><b>%s:</b> %s</li>' % i for i in context.environ.items())
yield '</ul>'
yield '</body></html>'
@html(methods=['post', 'put'])
def contact(self):
yield '<h1>Thanks: %s</h1>' % context.form['name'] if context.form else 'Please send a name.'
@html
def google(self):
raise HttpFound('http://google.com')
@html
def error(self):
raise Exception()
$ nanohttp demo
Or
from nanohttp import quickstart
quickstart(Root())
DO you need a WSGI
application?
app = Root().load_app()
# Pass the ``app`` to any ``WSGI`` server you want.
Create a maryjane.yml
file:
port: 8080
module: demo.py
controller: Root
config_file: demo.yml
# Storing the pid of current running server into the `pid` variable.
SHELL-INTO: pid netstat -lnpt 2>/dev/null | grep {port} | awk '{{split($7,a,"/"); printf a[1]}}'
ECHO: Old pid: {pid}
SHELL:
- if [ -n "{pid}" ]; then kill -9 {pid}; fi
- while [ -n "{pid}" -a -e /proc/{pid} ]; do sleep .6; done
- nanohttp -b {port} -c {config_file} {module}:{controller} & echo New pid: $!
WATCH-ALL:
- !^{here}[a-z0-9\.-_/]+\.(css|py|yml|js|html)$
$ pip3.6 install "maryjane>=4.4.0"
$ maryjane -w
Create a demo.yaml
file. The file below is same as the default configuration.
debug: true
domain:
cookie:
http_only: false
secure: false
You may use nanohttp.settings
anywhere to access the config values.
from nanohttp import Controller, html, settings
class Root(Controller):
@html
def index(self):
yield '<html><head><title>nanohttp demo</title></head><body>'
yield '<h2>debug flag is: %s</h2>' % settings.debug
yield '</body></html>'
Passing the config file(s) using command line:
$ nanohttp -c demo.yaml [-c another.yaml] demo
Passing the config file(s) Using python:
from nanohttp import quickstart
quickstart(Root(), config_files=['file1', 'file2'])
$ nanohttp -h
usage: nanohttp [-h] [-c CONFIG_FILE] [-b {HOST:}PORT] [-d DIRECTORY] [-V]
[MODULE{.py}{:CLASS}]
positional arguments:
MODULE{.py}{:CLASS} The python module and controller class to launch.
default is python built-in's : `demo_app`, And the
default value for `:CLASS` is `:Root` if omitted.
optional arguments:
-h, --help show this help message and exit
-c CONFIG_FILE, --config-file CONFIG_FILE
This option may be passed multiple times.
-b {HOST:}PORT, --bind {HOST:}PORT
Bind Address. default: 8080
-d DIRECTORY, --directory DIRECTORY
The path to search for the python module, which
contains the controller class. default is: `.`
-V, --version Show the version.