The artless and minimalistic web library for creating small applications or APIs.
Project description
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.
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 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
Algorithm | Hash digest | |
---|---|---|
SHA256 | ec1fbba0f2d87c30e07ff6ffc7f2072374c177f837fa4c791a4396cc626723ee |
|
MD5 | 07b4c7c70a853298cecb58fb6503cac2 |
|
BLAKE2b-256 | cf917e3df7531d2224a4ee31cf6bcb5bdb1f161233471b2b09149da7b103c9c3 |
File details
Details for the file artless_core-0.2.0-py3-none-any.whl
.
File metadata
- Download URL: artless_core-0.2.0-py3-none-any.whl
- Upload date:
- Size: 7.9 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/5.1.1 CPython/3.12.5
File hashes
Algorithm | Hash digest | |
---|---|---|
SHA256 | 97ebff84321b38974928e3cb133677f0341de0eef023a05a782b6a4dcd8584c1 |
|
MD5 | f2d6ef6997219381e7bdead248106d93 |
|
BLAKE2b-256 | f035e717d9e724faa484a4f870c00b00a3b285d77f56568992ff83ac2d9e7a70 |