web2py / py4web

Other
242 stars 124 forks source link

Errors Page Customization #545

Open rafucisneros opened 3 years ago

rafucisneros commented 3 years ago

I'm trying to customize the errors page for my application. I managed to customize 404 using "@bottle.error(404)" (although I think it changes the error page for every app) and 403 using a custom fixture to check user roles, but I can't figure a way to customize error 500.

According to @valq7711 this is not possible at the moment. https://github.com/web2py/py4web/blob/8512b5e0c7168131552477abfcf476c1f871c498/py4web/core.py#L806

I think while adding this feature would be good to also add a solution for 404, so we avoid using bottle for that.

agavgavi commented 3 years ago

I agree, and it’s something that I’m currently going to be working on in the next few weeks. I feel like it can be accomplished with a custom fixture that either gets auto injected or something else, or we could follow bottle’s format and have an @action.error decorator as well for a function.

The major issue I see is that it bottle.error as you said is global to py4web rather than app by app, so there must be a way to deal with that.

I’m not sure if Massimo has a better idea but I’ll try this and RFC it later in the month after my finals.

~Andrew

On Thu, May 27, 2021 at 3:11 PM rafucisneros @.***> wrote:

I'm trying to customize the errors page for my application. I managed to customize 404 using @.***(404)" (although I think it changes the error page for every app) and 403 using a custom fixture to check user roles, but I can't figure a way to customize error 500.

According to @valq7711 https://github.com/valq7711 this is not possible at the moment.

https://github.com/web2py/py4web/blob/8512b5e0c7168131552477abfcf476c1f871c498/py4web/core.py#L806

I think while adding this feature would be good to also add a solution for 404, so we avoid using bottle for that.

— You are receiving this because you are subscribed to this thread. Reply to this email directly, view it on GitHub https://github.com/web2py/py4web/issues/545, or unsubscribe https://github.com/notifications/unsubscribe-auth/AEB27MACETM23VYFYGCYUNLTP27S3ANCNFSM45VGI2DQ .

mdipierro commented 3 years ago

There are two problems . One problem is that some error pages (for example 404) cannot be application specific because which app is not defining the missing page. So who's responsibility is it to define the error page. Another problem is how to the case or an error in a custom error page.

One option is to create 404.html, 500.html, etc in template/errors/ and, if py4web knows which app to look into and find them, use them, else revert to current behavior. This would be easy.

Kkeller83 commented 3 years ago

An error app in the app folders with those templates seems cool to me. Would also make editing those templates a snap. There could be a scaffolding error app and the error app can be defined and customized per any other app that need to use it?

Kkeller83 commented 3 years ago

The issue is that we do our own app management instead of using a bottle instance per app. We are using one botte instance for all apps as far as I understand, hence we have the problem that all our error messages are global. Workaround is probably to save a list of apps and the stuff they need for custom error messages like links, texts, template paths for different errors in a config file such as json or yaml or even csv or the db and when py4web checks what app name is currently being used for the global error message in core.py it should check in that config file or db if this app with that app name that throws the error has a custom error html template and other related content that is supposed to be used. I commented on that in the mailing list in more detail.

mdipierro commented 2 years ago

Wasn't this solved by the move to ombott?

valq7711 commented 2 years ago

Wasn't this solved by the move to ombott?

No, ombott only allows customization of 404/405 errors, i.e. routing errors

mdipierro commented 2 months ago

This was done long ago

from py4web import ERROR_PAGES ERROR_PAGES["404"] = "Doh! 404"

This cannot be done per app so make sure only one app changes it.