Skip to main content

Welcome to Flash 👋

Version License: MIT

Flash is a Python based web framework that has been created to learn how web framework work under the hood

Quick Start

Install it:

pip install flash-framework

Basic Usage:

# app.py
from flash import Flash

app = Flash()


@app.route("/")
def home(req, resp):
    resp.text = "Hello, this is a home page."


@app.route("/about")
def about_page(req, resp):
    resp.text = "Hello, this is an about page."


@app.route("/{age:d}")
def tell_age(req, resp, age):
    resp.text = f"Your age is {age}"


@app.route("/{name:l}")
class GreetingHandler:
    def get(self, req, resp, name):
        resp.text = f"Hello, {name}"


@app.route("/show/template")
def handler_with_template(req, resp):
    resp.html = app.template("example.html", context={"title": "Awesome Framework", "body": "welcome to the future!"})


@app.route("/json")
def json_handler(req, resp):
    resp.json = {"this": "is JSON"}


@app.route("/custom")
def custom_response(req, resp):
    resp.body = b'any other body'
    resp.content_type = "text/plain"

Start:

gunicorn app:app

Handlers

If you use class based handlers, only the methods that you implement will be allowed:

@app.route("/{name:l}")
class GreetingHandler:
    def get(self, req, resp, name):
        resp.text = f"Hello, {name}"

This handler will only allow GET requests. That is, POST and others will be rejected. The same thing can be done with function based handlers in the following way:

@app.route("/", methods=["get"])
def home(req, resp):
    resp.text = "Hello, this is a home page."

Note that if you specify methods for class based handlers, they will be ignored.

Unit Tests

The recommended way of writing unit tests is with pytest. There are two built in fixtures that you may want to use when writing unit tests with Flash. The first one is app which is an instance of the main Flash class:

def test_route_overlap_throws_exception(app):
    @app.route("/")
    def home(req, resp):
        resp.text = "Welcome Home."

    with pytest.raises(AssertionError):
        @app.route("/")
        def home2(req, resp):
            resp.text = "Welcome Home2."

The other one is client that you can use to send HTTP requests to your handlers. It is based on the famous requests and it should feel very familiar:

def test_parameterized_route(app, client):
    @app.route("/{name}")
    def hello(req, resp, name):
        resp.text = f"hey {name}"

    assert client.get(url("/matthew")).text == "hey matthew"

Note that there is a url() function used. It is used to generate the absolute url of the request given a relative url. Import it before usage:

from flash.utils.tests import url

Templates

The default folder for templates is templates. You can change it when initializing the main Flash() class:

app = Flash(templates_dir="templates_dir_name")

Then you can use HTML files in that folder like so in a handler:

@app.route("/show/template")
def handler_with_template(req, resp):
    resp.html = app.template("example.html", context={"title": "Awesome Framework", "body": "welcome to the future!"})

Static Files

Just like templates, the default folder for static files is static and you can override it:

app = Flash(static_dir="static_dir_name")

Then you can use the files inside this folder in HTML files:

<!DOCTYPE html>
<html lang="en">

<head>
  <meta charset="UTF-8">
  <title>{{title}}</title>

  <link href="/static/main.css" rel="stylesheet" type="text/css">
</head>

<body>
    <h1>{{body}}</h1>
    <p>This is a paragraph</p>
</body>
</html>

Custom Exception Handler

Sometimes, depending on the exception raised, you may want to do a certain action. For such cases, you can register an exception handler:

def on_exception(req, resp, exception):
    if isinstance(exception, HTTPError):
        if exception.status == 404:
            resp.text = "Unfortunately the thing you were looking for was not found"
        else:
            resp.text = str(exception)
    else:
        # unexpected exceptions
        if app.debug:
            debug_exception_handler(req, resp, exception)
        else:
            print("These unexpected exceptions should be logged.")

app = Flash(debug=False)
app.add_exception_handler(on_exception)

This exception handler will catch 404 HTTPErrors and change the text to "Unfortunately the thing you were looking for was not found". For other HTTPErrors, it will simply show the exception message. If the raised exception is not an HTTPError and if debug is set to True, it will show the exception and its traceback. Otherwise, it will log it.

Middleware

You can create custom middleware classes by inheriting from the flash.middleware.Middleware class and override its two methods that are called before and after each request:

from flash import Flash
from flash.middleware import Middleware

app = Flash()


class SimpleCustomMiddleware(Middleware):
    def process_request(self, req):
        print("Before dispatch", req.url)

    def process_response(self, req, res):
        print("After dispatch", req.url)


app.add_middleware(SimpleCustomMiddleware)

ORM

Flash has a built-in ORM. Here is how you can use it:

# connect to database
from flash.orm import Database

db = Database("./test.db")

# define tables
class Author(Table):
    name = Column(str)
    age = Column(int)

class Book(Table):
    title = Column(str)
    published = Column(bool)
    author = ForeignKey(Author)

# create tables
db.create(Author)
db.create(Book)

# create an instance and insert a row
greg = Author(name="George", age=13)
db.save(greg)

# fetch all rows
authors = db.all(Author)

# get a specific row
author = db.get(Author, 47)

# save an object with a foreign key
book = Book(title="Building an ORM", published=True, author=greg)
db.save(book)

# fetch an object with a forein key
print(Book.get(55).author.name)

# update an object
book.title = "How to build an ORM"
db.update(book)

# delete an object
db.delete(Book, id=book.id)

Features

  • WSGI compatible
  • Built-in ORM
  • Parameterized and basic routing
  • Class based handlers
  • Test Client
  • Support for templates
  • Support for static files
  • Custom exception handler
  • Middleware

Author

👤 Manikant Kumar

Show your support

Give a ⭐️ if this project helped you!

Release files for flash-framework 1.0.0

For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.

Source distribution (sdist)

Source distribution for flash-framework 1.0.0
File Size Uploaded
flash-framework-1.0.0.tar.gz 12.4 kB Details

Built distribution (wheel)

Table of built distributions (wheels) for flash-framework 1.0.0
File Interpreter ABI Platform
flash_framework-1.0.0-py2.py3-none-any.whl Python 2, Python 3 none any Details

Total release size: 23.4 kB

Release files / flash-framework-1.0.0.tar.gz

Download URL flash-framework-1.0.0.tar.gz
Size 12.4 kB
Tags Source
SHA-256 checksum
How to use checksums
abee9f061fccf9d16c901ea6bd4afbc9c8015934c2de78bc6f63bd13b98a61fb
BLAKE2b-256 checksum
How to use checksums
cc313b5b86e51ea64eefa6f2ace4c0f6ee429bbead98dc0e94dc61ffc47067d1
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/3.4.1 importlib_metadata/4.6.1 pkginfo/1.5.0.1 requests/2.26.0 requests-toolbelt/0.9.1 tqdm/4.31.1 CPython/3.7.3

Release files / flash_framework-1.0.0-py2.py3-none-any.whl

Download URL flash_framework-1.0.0-py2.py3-none-any.whl
Size 11.0 kB
Tags Python 2 Python 3
SHA-256 checksum
How to use checksums
c0e462d632108a224dabb3718ec2a0d1338dac9909c9ef6cc9b55d01a13b351b
BLAKE2b-256 checksum
How to use checksums
146acf1ec3a6f2eddde92cac8ed6002ec7a8e923d41f52d47d61b904589ea17e
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/3.4.1 importlib_metadata/4.6.1 pkginfo/1.5.0.1 requests/2.26.0 requests-toolbelt/0.9.1 tqdm/4.31.1 CPython/3.7.3

Release history Release notifications | RSS feed

This release

1.0.0 This release

2 release files

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page