Monkey patch is wonderful. See this How to override method in frappe? - #53 by charleslcso.
However, there is this function that seems not like patching: frappe/app.py/application(request).
Here is what’s in hook.py in my custom app:
from custom_app.custom_app.custom_app import new_application
frappe.app.application = new_application
And in the actual custom_app.py, I have the same declaration too:
But this new_application(request) is never called.
Anyone experienced something similar?
The function you want to monkey patch is the WSGI application that’s used as an entry point - check the gunicorn or bench serve CLI (via Procfile in dev mode, and supervisor.conf in production).
You can update your supervisor conf to point the path to your newly defined function. Similarly, write a custom command for the developer server. Probably look into writing your own WSGI apps using Werkzeug for references if the Frappe codebase isn’t enough.
But this may not be what you want to do unless you’re well aware of the implications of your custom entrypoint. However, using hooks should be sufficient to extend Frappe to your use case.