<HTML><BODY style="word-wrap: break-word; -khtml-nbsp-mode: space; -khtml-line-break: after-white-space; "><DIV style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; "><FONT class="Apple-style-span" face="Times New Roman">Hello everybody,</FONT></DIV><DIV style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; font: normal normal normal 12px/normal Times New Roman; min-height: 15px; "><BR></DIV><DIV style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; "><FONT class="Apple-style-span" face="Times New Roman">as you know I teach web development with Python at DePaul and I would like to share my views on Django, Turbogears, Pylons, etc.</FONT></DIV><DIV style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; font: normal normal normal 12px/normal Times New Roman; min-height: 15px; "><BR></DIV><DIV style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; "><FONT class="Apple-style-span" face="Times New Roman">About the database-access API:</FONT></DIV><DIV style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; font: normal normal normal 12px/normal Times New Roman; min-height: 15px; "><BR></DIV><DIV style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; "><FONT class="Apple-style-span" face="Times New Roman">The Django API are better than SQLObjects and SQLAlchemy. They would be even better if they could take advantage of the “&gt;=” syntax (like SQLObjects) instead of the __gt syntax. SQLAlchemy goes in the wrong direction by making life too difficult for the developer. Teaching SQLAlchemy would be as difficult as teaching SQL. Storm.Canonical API seems even better than Django's API.</FONT></DIV><DIV style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; font: normal normal normal 12px/normal Times New Roman; min-height: 15px; "><BR></DIV><DIV style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; "><FONT class="Apple-style-span" face="Times New Roman">About template languages:</FONT></DIV><DIV style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; font: normal normal normal 12px/normal Times New Roman; min-height: 15px; "><BR></DIV><DIV style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; "><FONT class="Apple-style-span" face="Times New Roman">Kid/Genshi are the best. Students know XML therefore Kid is easy for them. Moreover it is the only template language that forces users to use write good XML. We teach students that they should use XML for nearly all web data exchange therefore Kid is perfect.</FONT></DIV><DIV style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; font: normal normal normal 12px/normal Times New Roman; min-height: 15px; "><BR></DIV><DIV style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; "><FONT class="Apple-style-span" face="Times New Roman">About Urls and Routes:</FONT></DIV><DIV style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; font: normal normal normal 12px/normal Times New Roman; min-height: 15px; "><BR></DIV><DIV style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; "><FONT class="Apple-style-span" face="Times New Roman">I do not like Django urls.py because they go in the direction of duplicating information instead of forcing users to follow good practice. For example, if I change name to a controller I also need to edit urls.py and vice versa; moreover I can have a form action with a different name than the name of the corresponding controller. This is very confusing to students. CherryPy and RoR instead enforce good practice. The ability to match arbitrary URLs should be optional and specified at the level of the controller (perhaps with a decorator).</FONT></DIV><DIV style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; font: normal normal normal 12px/normal Times New Roman; min-height: 15px; "><BR></DIV><DIV style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; "><FONT class="Apple-style-span" face="Times New Roman">WSGI and mod_python:</FONT></DIV><DIV style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; font: normal normal normal 12px/normal Times New Roman; min-height: 15px; "><BR></DIV><DIV style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; "><FONT class="Apple-style-span" face="Times New Roman">WSGI is an excellent idea but if it does not work with mod_python it is useless today. mod_python is faster, easier to deploy, and does not require advanced Apache knowledge. mod_rewrite is</FONT><FONT class="Apple-style-span" face="Times New Roman">  </FONT><FONT class="Apple-style-span" face="Times New Roman">difficult and way beyond the scope of a typical web development course.</FONT></DIV><DIV style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; font: normal normal normal 12px/normal Times New Roman; min-height: 15px; "><BR></DIV><DIV style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; "><FONT class="Apple-style-span" face="Times New Roman">Forms:</FONT></DIV><DIV style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; font: normal normal normal 12px/normal Times New Roman; min-height: 15px; "><BR></DIV><DIV style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; "><FONT class="Apple-style-span" face="Times New Roman">There is a perfect language for creating forms: HTML+CSS! Students know how to do it. Widgets add too much structure and will never be as flexible as HTML+CSS. WebHelpers are the best way to go. Pylons has them but they are not well documented and therefore unusable. WebHelpers should also generate javascript code for client-based validation (although this should not be a replacement for server-side validation).</FONT></DIV><DIV style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; font: normal normal normal 12px/normal Times New Roman; min-height: 15px; "><BR></DIV><DIV style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; "><FONT class="Apple-style-span" face="Times New Roman">Debugging</FONT></DIV><DIV style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; font: normal normal normal 12px/normal Times New Roman; min-height: 15px; "><BR></DIV><DIV style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; "><FONT class="Apple-style-span" face="Times New Roman">Pylons seems to be better than Django and Django is better than Turbogears (CherryPy).</FONT></DIV><DIV style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; "><FONT class="Apple-style-span" face="Times New Roman">Anyway, there should not be a debug ON/OFF setting. There should be a standard error page that allows login as administrator. If administrator is logged in he/she can see the debug information. If a user gets an error page, the error should be logged and the administrator should be contacted.</FONT></DIV><DIV style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; font: normal normal normal 12px/normal Times New Roman; min-height: 15px; "><BR></DIV><DIV style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; "><FONT class="Apple-style-span" face="Times New Roman">Django Generic Views, Turbogears Identity, etc.:</FONT></DIV><DIV style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; font: normal normal normal 12px/normal Times New Roman; min-height: 15px; "><BR></DIV><DIV style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; "><FONT class="Apple-style-span" face="Times New Roman">Django generic views are useful and so are Turbogears identity and registration but, these are optional features. They should be implemented as a set of advanced API to be used inside the controller. Otherwise there is too much magic going on.</FONT></DIV><DIV style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; font: normal normal normal 12px/normal Times New Roman; min-height: 15px; "><BR></DIV><DIV style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; "><FONT class="Apple-style-span" face="Times New Roman">General design issues:</FONT></DIV><DIV style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; font: normal normal normal 12px/normal Times New Roman; min-height: 15px; "><BR></DIV><DIV style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; "><FONT class="Apple-style-span" face="Times New Roman">There should be a single configuration file for the database (that defaults to SQLlite) and for email settings, like in TurboGears.</FONT></DIV><DIV style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; "><FONT class="Apple-style-span" face="Times New Roman">Sessions should always be on and should always be file based.</FONT><FONT class="Apple-style-span" face="Times New Roman"> </FONT></DIV><DIV style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; "><FONT class="Apple-style-span" face="Times New Roman">Page caching a la Django is a good idea and should be available as an optional feature via decorators.</FONT></DIV><DIV style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; "><FONT class="Apple-style-span" face="Times New Roman">There should be a small set of core API accessible via a single module. Django, for example, has too many modules and remembering which contains what is a major task.</FONT></DIV><DIV style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; font: normal normal normal 12px/normal Times New Roman; min-height: 15px; "><BR></DIV><DIV style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; "><FONT class="Apple-style-span" face="Times New Roman">The bottom line:</FONT></DIV><DIV style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; font: normal normal normal 12px/normal Times New Roman; min-height: 15px; "><BR></DIV><DIV style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; "><FONT class="Apple-style-span" face="Times New Roman">There is too much choice in the world of Pyhon web frameworks (and too many of them are 0.x) and this prevent us from making the case for each one of them against the Java dinosaur frameworks.</FONT></DIV><DIV style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; font: normal normal normal 12px/normal Times New Roman; min-height: 15px; "><BR></DIV><DIV style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; "><FONT class="Apple-style-span" face="Times New Roman">I have to teach this stuff therefore I can help the Python community to market their products. So far I have only covered Django in my classes because it is the only stable one and I was able to get the United Nations to use it. Nevertheless I am still waiting for the community come up with a real J2EE killer.</FONT></DIV><DIV style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; font: normal normal normal 12px/normal Times New Roman; min-height: 15px; "><BR></DIV><DIV style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; "><FONT class="Apple-style-span" face="Times New Roman">What I encourage you to do:</FONT></DIV><DIV style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; font: normal normal normal 12px/normal Times New Roman; min-height: 15px; "><BR></DIV><DIV style="text-indent: -18px;margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 36px; "><FONT class="Apple-style-span" face="Times New Roman">1)</FONT><SPAN class="Apple-tab-span" style="white-space:pre">        </SPAN><FONT class="Apple-style-span" face="Times New Roman">Keep in mind that too much choice is bad, not good</FONT></DIV><DIV style="text-indent: -18px;margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 36px; "><FONT class="Apple-style-span" face="Times New Roman">2)</FONT><SPAN class="Apple-tab-span" style="white-space:pre">        </SPAN><FONT class="Apple-style-span" face="Times New Roman">Do not reinvent the wheel</FONT></DIV><DIV style="text-indent: -18px;margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 36px; "><FONT class="Apple-style-span" face="Times New Roman">3)</FONT><SPAN class="Apple-tab-span" style="white-space:pre">        </SPAN><FONT class="Apple-style-span" face="Times New Roman">Keep the API stable, work on improving implementation and documentation</FONT><FONT class="Apple-style-span" face="Times New Roman"> </FONT></DIV><DIV style="text-indent: -18px;margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 36px; "><FONT class="Apple-style-span" face="Times New Roman">4)</FONT><SPAN class="Apple-tab-span" style="white-space:pre">        </SPAN><FONT class="Apple-style-span" face="Times New Roman">Have one person in change of usability and one in charge of security</FONT></DIV><DIV style="text-indent: -18px;margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 36px; "><FONT class="Apple-style-span" face="Times New Roman">5)</FONT><SPAN class="Apple-tab-span" style="white-space:pre">        </SPAN><FONT class="Apple-style-span" face="Times New Roman">Focus on a single framework (I suggest Pylons + Genshi + WebHelpers + Django or Canonical ORM) that works with mod_python, defaults to SQLlite and has sessions on by default. You already have all the pieces... just put package them well.</FONT></DIV><DIV style="text-indent: -18px;margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 36px; "><FONT class="Apple-style-span" face="Times New Roman">6)</FONT><SPAN class="Apple-tab-span" style="white-space:pre">        </SPAN><FONT class="Apple-style-span" face="Times New Roman">Make sure the ORM works with Oracle</FONT></DIV><DIV style="text-indent: -18px;margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 36px; "><FONT class="Apple-style-span" face="Times New Roman">7)</FONT><SPAN class="Apple-tab-span" style="white-space:pre">        </SPAN><FONT class="Apple-style-span" face="Times New Roman">Write API for Generic View, Login/Logout and Registration</FONT></DIV><DIV style="text-indent: -18px;margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 36px; "><FONT class="Apple-style-span" face="Times New Roman">8)</FONT><SPAN class="Apple-tab-span" style="white-space:pre">        </SPAN><FONT class="Apple-style-span" face="Times New Roman">Write documentation...</FONT></DIV><DIV style="text-indent: -18px;margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 36px; "><FONT class="Apple-style-span" face="Times New Roman">9)</FONT><SPAN class="Apple-tab-span" style="white-space:pre">        </SPAN><FONT class="Apple-style-span" face="Times New Roman">Write documentation...</FONT></DIV><DIV style="text-indent: -18px;margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 36px; "><FONT class="Apple-style-span" face="Times New Roman">10)</FONT><SPAN class="Apple-tab-span" style="white-space:pre">        </SPAN><FONT class="Apple-style-span" face="Times New Roman">Write documentation...</FONT></DIV><DIV style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; font: normal normal normal 12px/normal Times New Roman; min-height: 15px; "><BR></DIV><DIV style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; font: normal normal normal 12px/normal Times New Roman; min-height: 15px; ">You make this and I guarantee it will be used in a course at DePaul in the winter quarter.</DIV><DIV style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; font: normal normal normal 12px/normal Times New Roman; min-height: 15px; "><BR class="khtml-block-placeholder"></DIV><DIV style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; font: normal normal normal 12px/normal Times New Roman; min-height: 15px; ">Massimo</DIV><DIV style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; font: normal normal normal 12px/normal Times New Roman; min-height: 15px; "><BR></DIV><DIV style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; font: normal normal normal 12px/normal Times New Roman; min-height: 15px; "><BR></DIV><DIV style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; font: normal normal normal 12px/normal Times New Roman; min-height: 15px; "><BR></DIV><DIV style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; font: normal normal normal 12px/normal Times New Roman; min-height: 15px; "><BR></DIV><DIV style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; font: normal normal normal 12px/normal Times New Roman; min-height: 15px; "><BR></DIV><DIV style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; font: normal normal normal 12px/normal Times New Roman; min-height: 15px; "><BR></DIV><DIV style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; font: normal normal normal 12px/normal Times New Roman; min-height: 15px; "><BR></DIV><DIV style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; font: normal normal normal 12px/normal Times New Roman; min-height: 15px; "><BR></DIV><P style="margin: 0.0px 0.0px 0.0px 0.0px; min-height: 14.0px"><FONT class="Apple-style-span" face="Times New Roman"> </FONT><BR class="khtml-block-placeholder"></P><P style="margin: 0.0px 0.0px 0.0px 0.0px; min-height: 14.0px"><BR class="khtml-block-placeholder"></P></BODY></HTML>