From: J.J. D. <jd...@hy...> - 2001-04-07 00:08:44
|
Hi - I have hacked together a prototype web version of my transformer diagnostics app, which is 100% Python. For four days (April 1-4), I ran the web app on a laptop with a video projector at a big electric power industry trade show to get reactions from current and prospective customers. I am happy to say that the response from practically everybody was "I want it as soon as it is available." Because newbie Webware app developers may be interested, I will mention some of the things I have done or figured out so far. Apologies to the Webware gurus if this seems elementary, but it may be amusing to see how your beautiful tool is actually being used. My setup: 400-MHz Pentium II, 128 MB RAM, Windows 98, Apache 1.3.14, BeOpen Python 2.0, MSIE 4.0. Laptop is the same except 200 MHz. The core application code is in 6 python packages, each one a subdirectory of the application's main directory c:/program files/toa4a2, which is called the "top code directory" below. Each module in each package imports classes from other packages like this: "from db.spam import Spam". One of those packages, called "web," contains the base class modules (e.g. BaseSidebarPage.py) for the web interface. Another directory, c:/program files/webtoa, contains the servlet class modules which are directly involved in the web interface. I call that directory the "servlet directory." The servlet classes are subclasses of the base classes defined in the "web" package, and they do their imports like this: "from web.BaseSidebarPage import BaseSidebarPage." One of the servlets is index.py, containing a class "index" which is basically the front page of the web application. Webware is installed in C:/Python20/Webware. In Webware/WebKit/Configs/Application.config under Contexts, I inserted the name of my app and the path of the servlet directory. Having the code directory separate from the servlet directory is important so that users can only see the servlets. I modified OneShot.cgi and WebKit.cgi, naming them as webtoa1.cgi and webtoa.cgi, and put them into the Apache cgi-bin directory. In Windows, the top line of each cgi script should say #!c:/python20/python.exe. The modifications clean up sys.path and insert the code directory into sys.path along with WebwareDir. I think I will probably also do os.environ['CODEDIR'] = 'c:/program files/toa4a1' in the cgi scripts so that some of the core modules will be able to find their INI files and other resources. In the application code directory I put a modified copy of WebKit's Launch.py for launching the adapter. It does the same sys.path modifications that the cgi scripts do, because AsyncThreadedHTTPServer does not run a cgi script. On the other hand, the one-shot cgi script does not use an adapter. So for now the path initialization code has to be in two places. My BaseSidebarPage class and BasePage class (no sidebar) are derived from WebKit's SidebarPage and Page. The writeHeader() method of each inserts a reference to a style sheet for the app, like this: def writeHeader(self): uri = self.request().uriWebKitRoot() + 'WebTOA' self.writeln('<head>') self.writeln(' <title>%s</title>' % self.title()) self.writeln(' <link rel="stylesheet" type="text/css" href="%s">' % (uri + 'webtoa.css',)) self.writeln('</head>') self.writeln('<body>') All the HTML-generating code in the derived page classes uses the styles. This helps to reduce the tonnage of the page text and makes it easy to change layout details. The web app displays an assortment of tables of transformer diagnostic information. On two of the pages, the transformer ID in each row of the table is a link which feeds information from that row to another page which displays detail information for that particular equipment. That turned out to be surprisingly easy to do. The detail page uses self.request().field('equipmentid') to find out what to display. Note that self.request() does not work in __init__(), but should be used in awake() after the parent class awake() method has been called. It also dawned on me that the session object is a place where I can keep user-specific information such as "which transformer is the user currently fiddling with". Soon I will use UserKit to add logins. Webware is really great stuff, and big thanks to Chuck and the other developers for doing such a good job. Jim Dukarm DELTA-X RESEARCH Victoria BC Canada |