Use Decorators for Request Handlers

In this example, the decorator valid_id is defined that modifies a request handler to redirect to the home page if the user is not logged in.

This is done using the JustPy function redirect that accepts as an argument the URL to redirect to. The function returns a WebPage instance with the redirect attribute set based on the parameter.

import justpy as jp
from functools import wraps


logged_in = {}

def test_id(id):
    return id in logged_in

def valid_id(f):
    @wraps(f)
    def wrapper(request):
        bool_outcome = test_id(request.session_id)
        if bool_outcome:
            return f(request)
        else:
            return jp.redirect('/')
    return wrapper


def login_user(self, msg):
    logged_in[msg.session_id] = True


@jp.SetRoute('/login')
def login_page(request):
    wp = jp.WebPage()
    btn = jp.Button(text='Login', classes='m-4 ' + jp.Styles.button_simple, click=login_user, a=wp)
    return wp


@jp.SetRoute('/info')
@valid_id
def info_page(request):
    wp = jp.WebPage()
    jp.Div(text='Some info', classes='m-2 text-xl', a=wp)
    return wp

def home_page():
    wp = jp.WebPage()
    jp.A(text='Click to go to login page ', href='/login', a=wp, classes='m-4 text-xl' )
    return wp


jp.justpy(home_page)