artless-core 0.2.0

Creator: bradpython12

Last updated:

Add to Cart

Description:

artlesscore 0.2.0

artless-core





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

Artless, fast and small (less then 400 LOC) single-file module.
No third party dependencies (standart library only).
Support only modern versions of Python (>=3.10).
Mostly pure functions without side effects.
Interfaces with type annotations.
Comprehensive documentation with examples of use.
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.

License

For personal and professional use. You cannot resell or redistribute these repositories in their original state.

Customer Reviews

There are no reviews.