Skip to main content

A very micro http framework.

Project description

http://img.shields.io/pypi/v/nanohttp.svg Requirements Status https://travis-ci.org/pylover/nanohttp.svg?branch=master https://coveralls.io/repos/github/pylover/nanohttp/badge.svg?branch=master

A very micro HTTP framework.

Features

  • Very simple, less-code & fast

  • Using object dispatcher instead of regex route dispatcher.

  • Url-Encoded & Multipart form parsing.

  • No request and or response objects is available, everything is combined in nanohttp.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

  • Dispatch arguments using the obj.__annonations__

Roadmap

The road map is to keep it simple with 100% code coverage. no built-in template engine and or ORM will be included.

Install

PyPI

$ pip install --pre nanohttp

Source

$ cd path/to/nanohttp
$ pip install -e .

Quick Start

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())

WSGI

Do you need a WSGI application?

from nanohttp import configure

configure(config='<yaml config string>', config_files='path/to/config.file')
app = Root().load_app()
# Pass the ``app`` to any ``WSGI`` server you want.

Watch

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

Config File

Create a demo.yml 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.yml [-c another.yml] demo

Passing the config file(s) Using python:

from nanohttp import quickstart

quickstart(Root(), config_files=['file1', 'file2'])

Command Line Interface

$ 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.

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

nanohttp-0.1.0.dev42.tar.gz (11.9 kB view hashes)

Uploaded Source

Supported by

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