Passing data to/from Python
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. 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". 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? 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? 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)? 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? 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! Thanks in advance. Mark Wexler
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.
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".
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?
There's an ODBC database adapter for Windows machines. It does not work under UNIX. The Sybase DA works against MS SQL Server 6.5 and below from UNIX. Look under "Downloads" on Zope.org. Also read the ZSQL User Guide.
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?
Hmm. I've never seen ODBC.Windows. We've punted on supporting ODBC under UNIX, and we're now supposed to be contracting out to some other folks to provide it for us. Not sure when this will happen. You can try to write your own ODBC DA for UNIX/Linux. There is a HowTo on writing a DA someplace out there that Chris Petrilli wrote.
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)?
external method named "pyfunction": def pyfunction(self): return ['1','2','3'] a dtml method that uses pyfunction: <dtml-in pyfunction> <dtml-var sequence-item><br> </dtml-in> Should output: 1 2 3
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?
If you use an external method to handle the form input, you should be able to get at its attributes by looking in REQUEST ala: def myformhandler(self, REQUEST): a = REQUEST['a'] b = REQUEST['b'] where 'a' and 'b' are form field names. This can also be done by: def myformhandler(self): a = self.REQUEST['a'] b = self.REQUEST['b']
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!
Thanks in advance. Mark Wexler
_______________________________________________ Zope maillist - Zope@zope.org http://lists.zope.org/mailman/listinfo/zope ** No cross posts or HTML encoding! ** (Related lists - http://lists.zope.org/mailman/listinfo/zope-announce http://lists.zope.org/mailman/listinfo/zope-dev )
-- Chris McDonough Digital Creations Publishers of Zope - http://www.zope.org
process it (e.g., output a line for every member of the list)?
external method named "pyfunction":
def pyfunction(self): return ['1','2','3']
a dtml method that uses pyfunction:
Mind if I ask a follow up question to that? What if I wanted to return a list of hashes, how would I address the keys in the hashes?
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?
First of all, someone needs to let you know that data should never be stored in an Excel file. Anyway, what you would do is use the Zope ODBC database adapter. The Gadfly one is the only one installed by default, but others are availible at zope.org You really should be storing that in a relational database though. Speaking for years of database experience, Excel is never a good place to keep things.
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.
This isn't really a Zope issue. It's a bug in your script or the serveor or something to that effect.
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?
Ask those in the ODBC.Windows mailing list; this is not a Zope issue. You might consider though, not using so many external methods and whether writing packages - they are more powerful and can be more powerful. External Methods are usually for quick one-timers.
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)?
I beleive you can do just that - return it as a list, and use it like this inside DTML <dtml-in externalmethodid> ... </dtml-in>
4. The way I call my Python function now is through the > 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
I'll have to pass on this question to someone who is more experienced.
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!
Hang in there. Learning to do this kind of thing in ZOPE is hard - I know because I'm trying to do it myself.
I havent been able to track down whats causing this error, but PersistentList seems to be broken. From the monitor, this is what I see. When trying to import from a Python shell popped open in website/lib/python, it imports fine. Python 1.5.2 (#0, Jul 30 1999, 09:52:18) [MSC 32 bit (Intel)] Copyright 1991-1995 Stichting Mathematisch Centrum, Amsterdam Welcome to <secure_monitor_channel connected 127.0.0.1:2312 at e53bf0> [Hint: try 'from __main__ import *']
import Persistence from Persistence import PersistentMapping from Zodb import PersistentList a = PersistentList() Traceback (innermost last): File "C:\Zope\WebSite\ZServer\medusa\monitor.py", line 119, in found_terminator exec co in self.local_env File "<secure_monitor_channel connected 127.0.0.1:2312 at e53bf0>", line 1, in ? TypeError: call of non-function (type module) b = PersistentMapping()
At 09:26 PM 3/26/00 -0500, you wrote:
I havent been able to track down whats causing this error, but PersistentList seems to be broken.
import Persistence from Persistence import PersistentMapping from Zodb import PersistentList a = PersistentList() Traceback (innermost last): File "C:\Zope\WebSite\ZServer\medusa\monitor.py", line 119, in found_terminator exec co in self.local_env File "<secure_monitor_channel connected 127.0.0.1:2312 at e53bf0>", line 1, in ? TypeError: call of non-function (type module) b = PersistentMapping()
Yes, this is confusing. PersistentList is the name of the module, and also the name of the class within the module. What you're getting is the module, which is why it can't be called. To get to the class, you can either specify it explicitly: import ZODB import PersistentList mylist = PersistentList.PersistentList() Or, you can pull the class into your namespace: import ZODB from PersistentList import PersistentList mylist = PersistentList() Hope this helps, Andrew
participants (5)
-
Andrew Wilcox -
Chris McDonough -
Ken Kinder -
Mark Wexler -
morton@dennisinter.com