Skip to main content

a python library for building web applications

Project description

Pyonir Web Framework

Pyonir is a static site generator and flat file web framework written in Python. It allows you to create dynamic websites using simple markdown files and a powerful plugin architecture.

Install Pyonir

From pypi:

pip install pyonir

Create a new project

Manually create a main.py file from an empty directory with the following values.

Example

your_project/
    |─ __init__.py # makes this project a package
    └─ main.py     # entry point to your application

Example main.py file

import pyonir
app = pyonir.init(__file__)

or scaffold a demo web application from the cli:

> pyonir init

This will generate the following directory structure

your_project/
    ├─ backend/
    |  └─ README.md
    |  └─ __init__.py
    ├─ contents/
    |  ├─ pages/
    |     └─ index.md
    ├─ frontend/
    |  └─ README.md
    |  └─ pages.html
    └─ main.py
    └─ __init__.py

Configure Contents

Site content is stored in special markdown files within the contents directory. Each sub directory within the contents folder represents the content type for any contained markdown files.

Content Types

Organizes a collection of files by specified types in a directory.

Configs: contents/configs

Represents mutable site configurations that can change while app is running.

Pages: contents/pages

Represents routes accessible from a URL. A file from contents/pages/about.md can be accessed from a URL of https:0.0.0.0/about All pages files are served as text/html resources. You can configure your pages to be serverd from a different directory by overriding the Site.PAGES_DIRNAME default value.

API: contents/api

Files within this folder represents API endpoints. Files here can define the response of the request and call python functions. A file from contents/api/new_post.md can be accessed from a URL of https:0.0.0.0/api/new_post. You can configure your api pages to be serverd from a different directory by overriding the Site.API_DIRNAME default value.

Generate static site

import pyonir
app = pyonir.init(__file__)

app.generate_static_website()

Configure Route Controllers

Configuration based routing defined at startup. All routes live in one place — easier for introspection or auto-generation. This allows flexibility for functions to be access from virtual routes and registered at startup.

def demo_route(user_id: int = 5):
    # perform logic using the typed arguments passed to this function on request
    return f"user id is {user_id}"

routes: list['PyonirRoute'] = [
    ['/user/{user_id:int}', demo_route, ["GET"]],
]

# Define an endpoint routers
router: 'PyonirRouters' = [
    ('/api/demo', routes)
]

Run Web server

Pyonir uses the starlette webserver by default to process web request. Below is an example of how to install a route handler.

import pyonir

def demo_route(user_id: int = 5):
    # perform logic using the typed arguments passed to this function on request
    return f"user id is {user_id}"

routes: list['PyonirRoute'] = [
    ['/user/{user_id:int}', demo_route, ["GET"]],
]

# Define an endpoint routers
router: 'PyonirRouters' = [
    ('/api/demo', routes)
]

app = pyonir.init(__file__)

app.run(routes=router)

Configure Virtual Page Routes

Virtual routes

A virtual route can generate a page from aggregated data sources and giving more control on request response. Virtual routes can be defined within the contents/pages directory within a hidden .routes.md file. virtual routes can return the following response types:

  • HTML response
  • JSON response
  • WebSocket
  • Sever-Sent Events
  • Static file

JSON response

any pattern that begins with the default API name are automatically returning JSON.

/api/some_data/{data_id:str}: 
    GET.response: application/json
    data: hello {request.path_param.data_id} world

results from request http:0.0.0.0/api/some_data/a3b3c3

{
  "data": "hello a3b3c3 world"
}

HTML response

The page attribute value will be passed into the page request. The page url and slug are auto set from the request. Any scalar values will be passed as the page contents value. Only GET requests permitted by default.

/products/tags: 
    page:
        title: Products grouped by tags.
        contents: Listing of all products grouped by tags.
        template: product-tags.html
        entries: $dir/../products?groupby=tags

Server-sent events

/api/sse/user/notifications:
    GET.call: reference.path.to.sse.notifications.controller
    GET.headers.accept: text/event-stream

Websockets

/api/ws/user/chat:
    GET.call: path.to.websocket.module
    GET.headers.accept: text/event-stream

Configure Frontend

The frontend directory organizes your application themes. Each theme uses jinja template logic to generate data into HTML. Theme templates are stored in frontend/themes/{THEME_NAME}/layouts directory.

Configure Static Assets

...

Configure Plugins

...

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

pyonir-0.0.24.tar.gz (1.3 MB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

pyonir-0.0.24-py3-none-any.whl (1.3 MB view details)

Uploaded Python 3

File details

Details for the file pyonir-0.0.24.tar.gz.

File metadata

  • Download URL: pyonir-0.0.24.tar.gz
  • Upload date:
  • Size: 1.3 MB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.1.0 CPython/3.12.9

File hashes

Hashes for pyonir-0.0.24.tar.gz
Algorithm Hash digest
SHA256 fd6ac8ead51c02214e9196beca9ea42e248b2edf61d70709ffdf26de26503022
MD5 6fdd173e2b001f0a86fdd09d8f8c8ac1
BLAKE2b-256 f8bffa24f7d0bf05bea606e862b4435a270c8162d3a21cdcf538a54025aa9451

See more details on using hashes here.

File details

Details for the file pyonir-0.0.24-py3-none-any.whl.

File metadata

  • Download URL: pyonir-0.0.24-py3-none-any.whl
  • Upload date:
  • Size: 1.3 MB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.1.0 CPython/3.12.9

File hashes

Hashes for pyonir-0.0.24-py3-none-any.whl
Algorithm Hash digest
SHA256 8d3811945d32cece1b8b964b1da7ce33eff8e99e89041b2ee2e2f83148c6689d
MD5 7086b01a1f9d0894128f99e4a7feaf6d
BLAKE2b-256 d60726c565540dc7a94dc4de96959b5c1c9952c7ebef19c64faf924c093c7a15

See more details on using hashes here.

Supported by

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