One thing I always disliked about Webware is the static 404 error page.
First, the name '404Text.txt' is hard coded and misleading because it is
a complete HTML page (maybe it has only been the body part in older
versions, as it is still wrongly documented), so it should better be
called something like '404page.html'.
Second, you usually define a custom layout and CSS in your base servlet
class. If you don't want your 404 page to look completely different, you
are forced to insert (duplicate) the layout manually in the 404Text.txt
file. Therefore I'd like to be able to forward to an arbitrary servlet
in case of a 404 error, or generally, any http error. This servlet could
then simply use the same base class as the other servlets, and
everything will look neatly.
While you can install a customized error handler for exceptions that
occurred in the servlets using the Application._exceptionHandlerClass,
it does not seem to be possible to invoke a custom servlet on an
HTTPException. (Or am I overlooking something obvious?)
So I have just implemented such a feature, considering that I really
would like to have that before Webware 1.0.
I introduced a new Application.config setting "HTTPErrorPage". (If you
have a better name, let me know. I do not want to call it "ErrorPage"
because there are already many "Error" settings which all refer to
servlet exceptions, not HTTPExceptions.) For example:
HTTPErrorPage = {
'NotFound': '/Error404'
'SessionExpired': '/Expired',
'default': '/Error'
}
Webware will then forward to the URL '/Error404' if an HTTPNotFound
exception is raised. Integer error codes are also allowed as keys (e.g.
401: '/Expired'), but the names of the exceptions are more readable and
allow for finer granularity. E.g. 401 is also used for a more general
"authentication required" error. In the case that you only have one page
to be used as the default, I will allow the shorter notation:
HTTPErrorPage = '/Error'
If HTTPErrorPage is set to None, or you hit an HTTPException that is not
in HTTPErrorPage and there is no default key, then Webware will behave
exactly as before.
The error servlet could look like that:
------------- Error404.py ----------------
from MyPage import MyPage
class Error404(MyPage ):
def title(self):
return "This page does not exist!"
def writeContent(self):
self.write("""
<h4>You were not here:</h4>
<h3>%s</h3>
<h5>Let's never mention it again.</h5>
""" % self.htmlEncode(self.request().uri()))
--------------------------------------------
I have this already working. The error page will of course come with its
associated status code in the http header, automatically.
Let me know whether you think this all makes sense before I will check
it in ;-)
-- Chris
-------------------------------------------------------------------------
Take Surveys. Earn Cash. Influence the Future of IT
Join SourceForge.net's Techsay panel and you'll get the chance to share your
opinions on IT & business topics through brief surveys-and earn cash
http://www.techsay.com/default.php?page=join.php&p=sourceforge&CID=DEVDEV
_______________________________________________
Webware-devel mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/webware-devel