On Mon, 27 Mar 2000, Mark Wexler wrote:
Dear Zopistas,
I am in the process of learning about Zope, and trying to determine whether to make the switch from pure Python CGI scripts. If someone could answer the following questions (and I apologize, as it will probably seem naive), it would really help.
We all had to start somewhere.. (o8
Let's suppose I have a page where the user queries a data base, for instance a telephone directory. The telephone directory is in an Excel file. At present, I have a CGI script that opens an ODBC.Windows connection, executes an SQL query, and outputs the results (names, phone numbers) as an HTML table using "print".
Sounds simple enough...
What is the best way to do this in Zope? Here are the points that I don't get:
1. It seems that the only way to establish a DB connection is through Gadfly. There are warnings everywhere that Gadfly is inefficient. Therefore, I want to use ODBC (ODBC.Windows), like I did before. How?
Nonono.... ZOPE uses the Gadfly db to store "zope objects". It can also connect to other DBs, and access them via SQL methods. There are a number of DB interfaces, including an ODBC interface.
2. I might eventually need to do complex calculations on the retrieved data, so I would prefer using Python code in an external method, rather than a DTML method. In order to get Zope to accept the line "import ODBC.Windows", I had to copy the ODBC and DateTime directories from my regular Python installation (PYTHON/lib) to ZOPE/bin/lib. But then, when I try running the script, I get one of the following problems:
a. If I go through authentification, the script runs, but I cannot establish the connection to the database.
b. If I type in the URL of my search page directly, without authentification, I get a Zope error: "initialization of module mxODBC failed (exceptions.AttributeError:mxDateTimeAPI)".
Is my ODBC.Windows installation wrong, or do I have a more fundamental problem?
Erm.. i'm out of my depth on this one.... i'll leave that to someone else. (o8
3. What if my Python function in my external method wants to return information to my DTML method? For instance, how do I return a Python list, and what do I do in my DTML method to process it (e.g., output a line for every member of the list)?
afaik, you can simply return a list. As for iterating through the list, you would use <dtml-in myMethod> stuff goes here </dtml-in>
4. The way I call my Python function now is through the <form method="POST" action="search"> tag, where "search" is the external method ID. The form has a field called "name", and my Python function has an argument also called "name", and so it recuperates the string that was entered in the "name" field. Can I pass the "name" as an argument to a DTML method?
All fields passed in a POST are available via the REQUEST.form map. Also, so long as they don't match the name of other objects in the namespace, you can access then directly. So, your 'name' field will be accessible: <dtml-var name> <-- assuming you don't have any other objects called "name" <dtml-var "REQUEST['name']"> or <dtml-var "REQUEST.form['name']">
If these questions have answers, I would really appreciate them. Otherwise, if I'm completely off-base (for instance, if I'm thinking in Python terms and not in Zope terms), please point me in the right direction!
Here are my answers, I hope they help. I'm sure others will contribute comments, but feel free to grill me for further details.
Thanks in advance. Mark Wexler
-- Have a better one, Curtis. <dtml-var standard_work_disclaimer>