# Handling the modules ## Import the modules import modules.api.jwt as api_jwt We can see the `modules.api.jwt` in the import, It mean `modules/api/jwt.py`. ## Routing the handler The routing is starting in this class: @cherrypy.tools.accept(media="application/json") class handler(pages.main): def __init__(self): pages.main.__init__(self) def index(self, **kwargs): ... index.exposed = True def (self, **kwargs): ... .exposed = True The `index` on there is `yourdomain.com/`. let say the `` is `about` page. so the route for the `about` is `yourdomain.com/about`. How about if you want to create a route like this?: `yourdomain.com/about/profile` & `yourdomain.com/about/contact`. The syntax will like this: @cherrypy.tools.accept(media="application/json") class handler(pages.main): def __init__(self): pages.main.__init__(self) def index(self, **kwargs): kwargs["params_page"] = pages.main().user("home") return user_home.main().html(kwargs) index.exposed = True class about(pages.main): def profile(self, **kwargs): ... profile.exposed = True def contact(self, **kwargs): ... contact.exposed = True about=about() ## Add modules into handler The handler request have a 2 kind method: - Request with JSON - Request with POST ### Request with JSON when you create the handler with JSON request, the pattern will look like this: def (self, **kwargs): if cherrypy.request.method == 'OPTIONS': cherrypy_cors.preflight(allowed_methods=['GET', 'POST']) if cherrypy.request.method == 'POST': try: cherrypy.serving.response.headers['Content-Type'] = 'application/json' kwargs["body"] = cherrypy.request.body.read() ... ... except Exception as e: return .exposed = True ### Request with POST The handler with HTML request pattern look more simple than JSON request one. It look like this: def (self, **kwargs): return .exposed = True You can make it simple the pattern to look like this: def (self, **kwargs): return .exposed = True ### Explanation The `` is where you name the page. `` is the optional. It looks like this: authentication.token_check(f"{globalvar.GV_base_url}/?message=forbidden") `` is optional. It will use to get the session token and bring it into modules. Here is the example: kwargs["session_token"] = cherrypy.session.get("token") `` is the optional one. It is for safely giving return. When you want to use a template, we can use `` on there. For an example we want to use `user` and `email` template, so this is a sample: kwargs["template_user" ] = pages.main().user("register") kwargs["template_email" ] = pages.main().email("contact") The `template_user` and `template_email` now can be use in the module. ``, ``, and `` is the custom things. You can create a JSON response like this: module = api_jwt.main().change(kwargs) response = json.dumps(module, indent=2) return response.encode() or HTML response like this: return page_register.main().html(kwargs) For the `return`, you can change it into `raise` for redirect. Here is the example: ... response = api_auth.main().register(kwargs) if response["status"] == "success": raise cherrypy.HTTPRedirect(f"{globalvar.GV_base_url}/?message=success") else: raise cherrypy.HTTPRedirect(f"{globalvar.GV_base_url}/?message=failed") ... ### Session To keep session, we can use `cherrypy.session` like this: ... response = api_auth.main().login(kwargs) if response["status"] == "success": token = response["data"]["token" ] username = response["data"]["username" ] try: cherrypy.session["token" ] = str( token ) cherrypy.session["username" ] = str( username ) raise cherrypy.HTTPRedirect('/?message=success') except Exception as e: print(f"Error: {e}") raise cherrypy.HTTPRedirect('/login?message=failed') else: raise cherrypy.HTTPRedirect('/login?message=failed') ... And for the logout session, you can use this: ... cherrypy.lib.sessions.expire() raise cherrypy.HTTPRedirect(f"{globalvar.GV_base_url}/?message=logout") ... ## Sample ### JSON method def change(self, **kwargs): response = '{}' if cherrypy.request.method == 'OPTIONS': cherrypy_cors.preflight(allowed_methods=['GET', 'POST']) if cherrypy.request.method == 'POST': try: cherrypy.serving.response.headers['Content-Type'] = 'application/json' kwargs["body"] = cherrypy.request.body.read() module = api_jwt.main().change(kwargs) response = json.dumps(module, indent = 2) except Exception as e: response = '{}' return response.encode() change.exposed = True ### POST method For giving JSON response: def change(self, **kwargs): module = api_jwt.main().change(kwargs) response = json.dumps(module, indent=2) return response.encode() change.exposed = True For giving HTML response with Template page: def register(self, **kwargs): kwargs["params_page"] = pages.main().user("register") return page_register.main().html(kwargs) register.exposed = True as you can see in here `pages.main().user("register")`, you need to add template pages in the parameter if you want to use a template. ### Combine method Here is another JSON response that use a Template page: def contact(self, **kwargs): balikan = '{}' if cherrypy.request.method == 'OPTIONS': cherrypy_cors.preflight(allowed_methods=['GET', 'POST']) if cherrypy.request.method == 'POST': try: cherrypy.serving.response.headers['Content-Type'] = 'application/json' kwargs["body"] = cherrypy.request.body.read() kwargs["email"] = pages.main().contact() response = api_contact.main().contact(kwargs) balikan = json.dumps(response, indent = 2) except Exception as e: print(f"DEBUG ERROR: {e}") balikan = '{}' return balikan.encode() contact.exposed = True you can add the Template on the parameter like this: kwargs["email"] = pages.main().contact()