Skip to main content

The artless and minimalistic web library for creating small applications or APIs.

Project description

artless-core

PyPI - License PyPI Version Development Status PyPI - Python Version Downloads

The artless and minimalistic web library for creating small applications or APIs.

Motivation

An extremely minimalistic framework was needed to create the same minimalistic applications. Those "micro" frameworks like Flask, Pyramid, CherryPie, etc - turned out to be not micro at all). Even a single-module Bottle turned out to be a "monster" of 4 thousand LOC and supporting compatibility with version 2.7.

Therefore, it was decided to sketch out our own simple, minimally necessary implementation of the WSGI library for creating small/simple web app.

Main principles

  1. Artless, fast and small (less then 400 LOC) single-file module.
  2. No third party dependencies (standart library only).
  3. Support only modern versions of Python (>=3.10).
  4. Mostly pure functions without side effects.
  5. Interfaces with type annotations.
  6. Comprehensive documentation with examples of use.
  7. Full test coverage.

Limitations

  • No Async/ASGI support.
  • No WebSocket support.
  • No Cookies support.
  • No multipart/form-data support.
  • No built-in protections, such as: CSRF, XSS, clickjacking and other.

Installation

$ pip install artless-core

Getting Started

from http import HTTPStatus
from os import getenv

from artless import App, Request, Response, ResponseFactory


def get_template(username: str) -> str:
    return f"""
    <!DOCTYPE html>
    <html lang="en">
      <head>
        <meta charset="utf-8">
        <title>Say hello</title>
      </head>
      <body>
        <h1>Hello, {username}!</h1>
      </body>
    </html>
    """


def say_hello(request: Request, username: str) -> Response:
    available_formats = {
        "json": ResponseFactory.json({"hello": username}),
        "plain": ResponseFactory.plain(f"Hello, {username}!"),
        "html": ResponseFactory.html(get_template(username)),
    }

    format = request.query.get("format", ["plain"])[0]

    if format not in available_formats:
        return ResponseFactory.create(status=HTTPStatus.BAD_REQUEST)

    return available_formats[format]


def create_application() -> App:
    app = App()
    app.set_routes([("GET", r"^/hello/(?P<username>\w+)$", say_hello)])
    return app


application = create_application()

if __name__ == "__main__":
    from wsgiref.simple_server import make_server

    host = getenv("HOST", "127.0.0.1")
    port = int(getenv("PORT", 8000))

    with make_server(host, port, application) as httpd:
        print(f"Started WSGI server on {host}:{port}")
        httpd.serve_forever()

Run it:

$ python3 app.py
Started WSGI server on 127.0.0.1:8000

Check it:

$ curl http://127.0.0.1:8000/hello/Peter
Hello, Peter!

$ curl http://127.0.0.1:8000/hello/Peter?format=html
<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="utf-8">
    <title>Say hello</title>
  </head>
  <body>
    <h1>Hello, Peter!</h1>
  </body>
</html>

$ curl http://127.0.0.1:8000/hello/Peter?format=json
{"hello": "Peter"}

Need more? See documentation and examples.

Roadmap

  • Add ASGI support.
  • Add plugin support.
  • Add cookies support.
  • Add async interface.
  • Add multipart/form-data support.
  • Add test client.
  • Add benchmarks.
  • Add more examples.
  • Add Sphinx doc.

Related projects

  • artless-template - the artless and small template library for server-side rendering.

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

artless_core-0.2.0.tar.gz (11.1 kB view details)

Uploaded Source

Built Distribution

artless_core-0.2.0-py3-none-any.whl (7.9 kB view details)

Uploaded Python 3

File details

Details for the file artless_core-0.2.0.tar.gz.

File metadata

  • Download URL: artless_core-0.2.0.tar.gz
  • Upload date:
  • Size: 11.1 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/5.1.1 CPython/3.12.5

File hashes

Hashes for artless_core-0.2.0.tar.gz
Algorithm Hash digest
SHA256 ec1fbba0f2d87c30e07ff6ffc7f2072374c177f837fa4c791a4396cc626723ee
MD5 07b4c7c70a853298cecb58fb6503cac2
BLAKE2b-256 cf917e3df7531d2224a4ee31cf6bcb5bdb1f161233471b2b09149da7b103c9c3

See more details on using hashes here.

File details

Details for the file artless_core-0.2.0-py3-none-any.whl.

File metadata

File hashes

Hashes for artless_core-0.2.0-py3-none-any.whl
Algorithm Hash digest
SHA256 97ebff84321b38974928e3cb133677f0341de0eef023a05a782b6a4dcd8584c1
MD5 f2d6ef6997219381e7bdead248106d93
BLAKE2b-256 f035e717d9e724faa484a4f870c00b00a3b285d77f56568992ff83ac2d9e7a70

See more details on using hashes here.

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