Flask-File-Routes
File-based routing with a new mix-code file format that combines python code and a jinja template.
Inspired by Astro pages.
This uses Jinjapy for the page format.
Installation
pip install flask-file-routes
Usage
Activate the extension:
from flask import Flask
from flask_file_routes import FileRoutes
app = Flask(__name__)
FileRoutes(app)
Create a pages/index.jpy file:
---
page.message = "hello world"
def post():
page.message = f"hello {request.form['name']}"
---
{{ message }}
<hr>
<form method="post">
<input type="text" name="name" placeholder="your name">
<button type="submit">say hello</button>
</form>
Go to http://localhost:5000.
Dynamic pages
Dynamic pages can use the following formats:
- jpy: jinjapy hybrid format that let you execute code before rendering the template
- py: python code only
A jinjapy file contains 2 sections:
- Some Python code enclosed by lines containg 3 dashes "---"
- A body containing some Jinja template code
Both are optional:
- If the python code is missing, the file only contains a Jinja template
- If the python code is left unclosed (the file starts with "---" on a single line followed by some python code), the file has no template
The python code has a few global variables injected when executed: page, request, abort, redirect, url_for, current_app, render_template.
Content pages
No python code will be executed on content pages.
Content pages can use the following formats:
- html: a standard jinja template
- md: a standard jinja template that will be rendered using markdown
All formats can have a YAML frontmatter defining variables that will be injected in the page object.
How routing works
The URL rule is constructed using the following rules:
index.extfile are roots- folder hierarchy are transformed to url paths:
posts/release-annoucement.extconverts to/posts/release-annoucementposts/index.extconverts to/postsfolder/subfolder/page.extconverts to/folder/subfolder/page
- placeholders are allowed in filenames as they would in url rules
posts/<slug>.extconverts to/posts/<slug>
- surround a folder name with parentheses so that it does not appear in the url
folder/(subfolder)/page.extconverts to/folder/page
Allowed HTTP methods are determined by, in order:
- A comment at the start of the python code listing allowed http methods in the following format:
# methods=GET,POST - functions with HTTP method names in lower case
The page object
The page object is accessible under flask_file_routes.page or g.page in all endpoints of your app.
Any properties set onto the object will be available as a variable in the template.
You can send a response immediatly and stop any further processing using page.respond(response).
View args are available as read-only properties of the page object.
from flask_file_routes import page
@app.route("/")
def index():
page.message = "hello world"
return render_template_string("{{message}}")
Helpers can be registered on the page object:
file_routes = FileRoutes(app)
@file_routes.page_helper
def method(page):
return request.method
pages/index.jpy
---
#methods=GET,POST
if page.method == "POST": # call the helper
page.message = "hello from post"
else:
page.message = "hello from get"
---
{{message}}
Special page properties
Setting some properties on the page obejct will affect how the template is rendered:
page.is_markdown: after the jinja template is rendered, it will be processed by the markdown converterpage.layout: wrap the page output in a layout. This should be a template path that will be extended. You can specify the name of the block to override after a colon (eg:layout.html:my_block)
Metadata
Release files for flask-file-routes 0.3.2
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | |
|---|---|---|---|
| flask_file_routes-0.3.2.tar.gz | 5.3 kB | Details |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Reset |
|---|---|---|---|---|
| flask_file_routes-0.3.2-py3-none-any.whl | Python 3 | none | any | Details |
Total release size: 11.8 kB
Release files / flask_file_routes-0.3.2.tar.gz
| Download URL | flask_file_routes-0.3.2.tar.gz |
|---|---|
| Size | 5.3 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
288250bbbefcf24602da53d9723d472a16217b22514dc1f4a1c7b0c21446dd97
|
|
BLAKE2b-256 checksum How to use checksums |
0a0896108be104b37b2424a3a37434ffbab0ee2c617bdae85884f483e8452d31
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
uv/0.8.17
|
Release files / flask_file_routes-0.3.2-py3-none-any.whl
| Download URL | flask_file_routes-0.3.2-py3-none-any.whl |
|---|---|
| Size | 6.6 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
f91ea5cab20e4675162abae6fbac056f7f149d4f25040ecb95096ef79d0b8437
|
|
BLAKE2b-256 checksum How to use checksums |
b224ec3b4e4e34a9d5c4361f0f39dff5da7e7bf174293d75290608f75d9710f9
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
uv/0.8.17
|