Accessing .gif on disk with Python Product?
I am writing a python product and want to display a GIF file in some of the manage_pages. It is not meant to be the "icon" property of the class, just an image to be included in DTML. I included it in my class as follows: chooser = ImageFile('images/chooser.gif',globals()), but when I call it in DTML (<dtml-var chooser>) I get the following: <ImageFile instance at 014F1D90> I thought maybe I could use an instance of the Image class: chooser = OFS.Image('images/chooser.gif',globals()), but this doesn't seem to work. How do you create an instance of an Image in a Python Product? kh
On Mon, Aug 07, 2000 at 11:21:53AM -0300, Performance.net Strategic Internet Solutions wrote:
I am writing a python product and want to display a GIF file in some of the manage_pages. It is not meant to be the "icon" property of the class, just an image to be included in DTML. I included it in my class as follows:
chooser = ImageFile('images/chooser.gif',globals()),
but when I call it in DTML (<dtml-var chooser>) I get the following:
<ImageFile instance at 014F1D90>
I thought maybe I could use an instance of the Image class:
chooser = OFS.Image('images/chooser.gif',globals()),
but this doesn't seem to work.
How do you create an instance of an Image in a Python Product?
ImageFile objects do not (like ZODB stored Image objects) generate an IMG tag when called. Image object, when called, generate an IMG tag that points the browser to the correct address to retrieve tha actual image. With an ImageFile object, you need to construct the tag yourself. If this class has an instance foo, with this ImageFile attribute chooser, and the instance foo is stored in the root of your Zope ZODB, you need to point the browser to http://yoursever/foo/chooser. So your DTML needs to generate the following HTML: <img src="http://yoursever/foo/chooser"> I don't know enough about your DTML, but if it is another attribute of the same class, you could use one of the URLx REQUEST variables or something to construct the URL for the image. Also, absolute_url() called on the foo instance may also work for a base URL. Hope this helps. -- Martijn Pieters | Software Engineer mailto:mj@digicool.com | Digital Creations http://www.digicool.com/ | Creators of Zope http://www.zope.org/ | ZopeStudio: http://www.zope.org/Products/ZopeStudio -----------------------------------------------------
----- Original Message ----- From: "Martijn Pieters" <mj@digicool.com> To: "Performance.net Strategic Internet Solutions" <support@performance-net.com> Cc: "ZOPE Mailing List" <zope@zope.org> Sent: Monday, August 07, 2000 12:19 PM Subject: Re: [Zope] Accessing .gif on disk with Python Product?
On Mon, Aug 07, 2000 at 11:21:53AM -0300, Performance.net Strategic
Internet Solutions wrote:
I am writing a python product and want to display a GIF file in some of the manage_pages. It is not meant to be the "icon" property of the class, just an image to be included in DTML. I included it in my class as follows:
chooser = ImageFile('images/chooser.gif',globals()),
but when I call it in DTML (<dtml-var chooser>) I get the following:
<ImageFile instance at 014F1D90>
I thought maybe I could use an instance of the Image class:
chooser = OFS.Image('images/chooser.gif',globals()),
but this doesn't seem to work.
How do you create an instance of an Image in a Python Product?
ImageFile objects do not (like ZODB stored Image objects) generate an IMG tag when called. Image object, when called, generate an IMG tag that points the browser to the correct address to retrieve tha actual image.
With an ImageFile object, you need to construct the tag yourself. If this class has an instance foo, with this ImageFile attribute chooser, and the instance foo is stored in the root of your Zope ZODB, you need to point the browser to http://yoursever/foo/chooser. So your DTML needs to generate the following HTML:
<img src="http://yoursever/foo/chooser">
I don't know enough about your DTML, but if it is another attribute of the same class, you could use one of the URLx REQUEST variables or something to construct the URL for the image. Also, absolute_url() called on the foo instance may also work for a base URL.
Hope this helps.
-- Martijn Pieters | Software Engineer mailto:mj@digicool.com | Digital Creations http://www.digicool.com/ | Creators of Zope http://www.zope.org/ | ZopeStudio: http://www.zope.org/Products/ZopeStudio -----------------------------------------------------
Okay, I've done the following: # Create the method in the .py Class File chooserIcon=ImageFile('images/chooserIcon.gif',globals()), # Call from the .dtml File <img src="<dtml-var absolute_url>/chooserIcon" border=0> absolute_url() works and the URL points correctly to http://myserver/foo/chooserIcon, but if I type in that URL directly, I get a "Not Found" error as though the method does not exist. I've double-checked that the image is there and named correctly, so it's not a syntax thing. Perhaps I need to convert it to an "Image" object something like below? # this doesn't work but illustrates the idea chooserIcon = Image( ImageFile('images/chooserIcon.gif',globals() ) Help! =:) Kevin
On Mon, Aug 07, 2000 at 01:12:03PM -0300, Performance.net Strategic Internet Solutions wrote:
On Mon, Aug 07, 2000 at 11:21:53AM -0300, Performance.net Strategic Internet Solutions wrote:
I am writing a python product and want to display a GIF file in some of the manage_pages. It is not meant to be the "icon" property of the class, just an image to be included in DTML. I included it in my class as follows:
chooser = ImageFile('images/chooser.gif',globals()),
but when I call it in DTML (<dtml-var chooser>) I get the following:
<ImageFile instance at 014F1D90>
I thought maybe I could use an instance of the Image class:
chooser = OFS.Image('images/chooser.gif',globals()),
but this doesn't seem to work.
How do you create an instance of an Image in a Python Product?
ImageFile objects do not (like ZODB stored Image objects) generate an IMG tag when called. Image object, when called, generate an IMG tag that points the browser to the correct address to retrieve tha actual image.
With an ImageFile object, you need to construct the tag yourself. If this class has an instance foo, with this ImageFile attribute chooser, and the instance foo is stored in the root of your Zope ZODB, you need to point the browser to http://yoursever/foo/chooser. So your DTML needs to generate the following HTML:
<img src="http://yoursever/foo/chooser">
I don't know enough about your DTML, but if it is another attribute of the same class, you could use one of the URLx REQUEST variables or something to construct the URL for the image. Also, absolute_url() called on the foo instance may also work for a base URL.
Hope this helps.
Okay, I've done the following:
# Create the method in the .py Class File chooserIcon=ImageFile('images/chooserIcon.gif',globals()),
# Call from the .dtml File <img src="<dtml-var absolute_url>/chooserIcon" border=0>
absolute_url() works and the URL points correctly to http://myserver/foo/chooserIcon, but if I type in that URL directly, I get a "Not Found" error as though the method does not exist. I've double-checked that the image is there and named correctly, so it's not a syntax thing.
Perhaps I need to convert it to an "Image" object something like below?
# this doesn't work but illustrates the idea chooserIcon = Image( ImageFile('images/chooserIcon.gif',globals() )
Help! =:)
Hmm.. This is how Product Icons are stored, that is, as ImageFile objects. At product init time, a ImageFile objetcs is created for the Product icon and stroed in the special misc_ structure for later access. Have a look through the Product initialisation code, which is started up in OFS/Application.py::install_products(). -- Martijn Pieters | Software Engineer mailto:mj@digicool.com | Digital Creations http://www.digicool.com/ | Creators of Zope http://www.zope.org/ | ZopeStudio: http://www.zope.org/Products/ZopeStudio -----------------------------------------------------
Right you are, here's how I solved it: # __init.py__ for myProduct misc_={ 'chooserIcon': ImageFile('images/chooserIcon.gif',globals()), } # DTML file <img src="<dtml-var absolute_url>/misc_/myProduct/chooserIcon" border=0> Thanks! Kevin ----- Original Message ----- From: "Martijn Pieters" <mj@digicool.com> To: "Performance.net Strategic Internet Solutions" <support@performance-net.com> Cc: "ZOPE Mailing List" <zope@zope.org> Sent: Monday, August 07, 2000 1:15 PM Subject: Re: [Zope] Accessing .gif on disk with Python Product?
On Mon, Aug 07, 2000 at 01:12:03PM -0300, Performance.net Strategic
Internet Solutions wrote:
On Mon, Aug 07, 2000 at 11:21:53AM -0300, Performance.net Strategic Internet Solutions wrote:
I am writing a python product and want to display a GIF file in some of the manage_pages. It is not meant to be the "icon" property of the class, just an image to be included in DTML. I included it in my class as follows:
chooser = ImageFile('images/chooser.gif',globals()),
but when I call it in DTML (<dtml-var chooser>) I get the following:
<ImageFile instance at 014F1D90>
I thought maybe I could use an instance of the Image class:
chooser = OFS.Image('images/chooser.gif',globals()),
but this doesn't seem to work.
How do you create an instance of an Image in a Python Product?
ImageFile objects do not (like ZODB stored Image objects) generate an IMG tag when called. Image object, when called, generate an IMG tag that points the browser to the correct address to retrieve tha actual image.
With an ImageFile object, you need to construct the tag yourself. If this class has an instance foo, with this ImageFile attribute chooser, and the instance foo is stored in the root of your Zope ZODB, you need to point the browser to http://yoursever/foo/chooser. So your DTML needs to generate the following HTML:
<img src="http://yoursever/foo/chooser">
I don't know enough about your DTML, but if it is another attribute of the same class, you could use one of the URLx REQUEST variables or something to construct the URL for the image. Also, absolute_url() called on the foo instance may also work for a base URL.
Hope this helps.
Okay, I've done the following:
# Create the method in the .py Class File chooserIcon=ImageFile('images/chooserIcon.gif',globals()),
# Call from the .dtml File <img src="<dtml-var absolute_url>/chooserIcon" border=0>
absolute_url() works and the URL points correctly to http://myserver/foo/chooserIcon, but if I type in that URL directly, I get a "Not Found" error as though the method does not exist. I've double-checked that the image is there and named correctly, so it's not a syntax thing.
Perhaps I need to convert it to an "Image" object something like below?
# this doesn't work but illustrates the idea chooserIcon = Image( ImageFile('images/chooserIcon.gif',globals() )
Help! =:)
Hmm.. This is how Product Icons are stored, that is, as ImageFile objects. At product init time, a ImageFile objetcs is created for the Product icon and stroed in the special misc_ structure for later access.
Have a look through the Product initialisation code, which is started up in OFS/Application.py::install_products().
-- Martijn Pieters | Software Engineer mailto:mj@digicool.com | Digital Creations http://www.digicool.com/ | Creators of Zope http://www.zope.org/ | ZopeStudio: http://www.zope.org/Products/ZopeStudio -----------------------------------------------------
On Mon, Aug 07, 2000 at 01:38:56PM -0300, Kevin Howe wrote:
Right you are, here's how I solved it:
# __init.py__ for myProduct
misc_={ 'chooserIcon': ImageFile('images/chooserIcon.gif',globals()), }
# DTML file
<img src="<dtml-var absolute_url>/misc_/myProduct/chooserIcon" border=0>
misc_ is a root level object. Using absolute_url you are acquiring it into your Instance URL, which is not necessary (and will hamper off-server caching). Use &dtml-SCRIPT_NAME; instead (which will give you the absolute url of the root object in all cases): <img src="&dtml-SCRIPT_URL;/misc_/myProduct/chooserIcon" border=0> -- Martijn Pieters | Software Engineer mailto:mj@digicool.com | Digital Creations http://www.digicool.com/ | Creators of Zope http://www.zope.org/ | ZopeStudio: http://www.zope.org/Products/ZopeStudio -----------------------------------------------------
From: Martijn Pieters <mj@digicool.com>
misc_ is a root level object. Using absolute_url you are acquiring it into your Instance URL, which is not necessary (and will hamper off-server caching). Use &dtml-SCRIPT_NAME; instead (which will give you the absolute url of the root object in all cases):
<img src="&dtml-SCRIPT_URL;/misc_/myProduct/chooserIcon" border=0>
I sugget using "&dtml-BASE1;", since SCRIPT_NAME doesn't work well with virtual hosting. Cheers, Evan @ digicool & 4-am
On Mon, Aug 07, 2000 at 04:23:36PM -0400, Evan Simpson wrote:
From: Martijn Pieters <mj@digicool.com>
misc_ is a root level object. Using absolute_url you are acquiring it into your Instance URL, which is not necessary (and will hamper off-server caching). Use &dtml-SCRIPT_NAME; instead (which will give you the absolute url of the root object in all cases):
<img src="&dtml-SCRIPT_URL;/misc_/myProduct/chooserIcon" border=0>
I sugget using "&dtml-BASE1;", since SCRIPT_NAME doesn't work well with virtual hosting.
I don't see this would make a difference; Zope is passed the base URL at which it takes over the URL. A SiteAccess object may only influence parts of the URL that come _after_ this base. http://zopeintherooturl/foo, where foo is a Zope object, has SCRIPT_NAME='/', while http://zopeinasuburl/zope/foo, has SCRIPT_NAME='/zope/'. Zope may remove the foo from the URL because of some Virtual Host rule, SCRIPT_NAME will still be valid. -- Martijn Pieters | Software Engineer mailto:mj@digicool.com | Digital Creations http://www.digicool.com/ | Creators of Zope http://www.zope.org/ | ZopeStudio: http://www.zope.org/Products/ZopeStudio -----------------------------------------------------
Martijn Pieters wrote:
On Mon, Aug 07, 2000 at 04:23:36PM -0400, Evan Simpson wrote:
From: Martijn Pieters <mj@digicool.com>
misc_ is a root level object. Using absolute_url you are acquiring it into your Instance URL, which is not necessary (and will hamper off-server caching). Use &dtml-SCRIPT_NAME; instead (which will give you the absolute url of the root object in all cases):
<img src="&dtml-SCRIPT_URL;/misc_/myProduct/chooserIcon" border=0>
I sugget using "&dtml-BASE1;", since SCRIPT_NAME doesn't work well with virtual hosting.
I don't see this would make a difference; Zope is passed the base URL at which it takes over the URL. A SiteAccess object may only influence parts of the URL that come _after_ this base.
http://zopeintherooturl/foo, where foo is a Zope object, has SCRIPT_NAME='/', while http://zopeinasuburl/zope/foo, has SCRIPT_NAME='/zope/'. Zope may remove the foo from the URL because of some Virtual Host rule, SCRIPT_NAME will still be valid.
Sorry, I'd have to agree with Evan on this one. I'm pretty sure I've had SiteAccess not play nicely wih SCRIPT_NAME whereas BASE1 works fine... cheers, Chris
On Mon, Aug 07, 2000 at 10:08:06PM +0100, Chris Withers wrote:
I don't see this would make a difference; Zope is passed the base URL at which it takes over the URL. A SiteAccess object may only influence parts of the URL that come _after_ this base.
http://zopeintherooturl/foo, where foo is a Zope object, has SCRIPT_NAME='/', while http://zopeinasuburl/zope/foo, has SCRIPT_NAME='/zope/'. Zope may remove the foo from the URL because of some Virtual Host rule, SCRIPT_NAME will still be valid.
Sorry, I'd have to agree with Evan on this one. I'm pretty sure I've had SiteAccess not play nicely wih SCRIPT_NAME whereas BASE1 works fine...
I still think something else was broken, SiteAccess should (and does, as far as I know) stay away from SCRIPT_NAME. It could be that this is not the case, which would be a bug. One way of telling this is if in the management interface, icons in the left hand tree are broken. They rely on SCRIPT_NAME for URL generation. -- Martijn Pieters | Software Engineer mailto:mj@digicool.com | Digital Creations http://www.digicool.com/ | Creators of Zope http://www.zope.org/ | ZopeStudio: http://www.zope.org/Products/ZopeStudio -----------------------------------------------------
From: Martijn Pieters <mj@digicool.com>
I still think something else was broken, SiteAccess should (and does, as far as I know) stay away from SCRIPT_NAME.
Yep. Environment/CGI variables are left alone by the virtual hosting machinery; only Zope-specific ones are altered. An example of a virtual hosting setup which won't work with SCRIPT_NAME: Apache on machine www.foo.com proxies requests for /Zope/* to machine z.foo.com:8080. In this case SCRIPT_NAME is blank, and the src of an image on http://www.foo.com/Zope/page constructed with it would resolve to http://www.foo.com/image.gif, rather than http://www.foo.com/Zope/image.gif. This is not a contrived example -- people are doing this. SCRIPT_NAME will work in simple cases, but BASE1 ought to work in all cases, and using it is a better habit to have in general. Cheers, Evan @ digicool & 4-am
On Tue, Aug 08, 2000 at 12:45:02PM -0400, Evan Simpson wrote:
From: Martijn Pieters <mj@digicool.com>
I still think something else was broken, SiteAccess should (and does, as far as I know) stay away from SCRIPT_NAME.
Yep. Environment/CGI variables are left alone by the virtual hosting machinery; only Zope-specific ones are altered.
An example of a virtual hosting setup which won't work with SCRIPT_NAME: Apache on machine www.foo.com proxies requests for /Zope/* to machine z.foo.com:8080. In this case SCRIPT_NAME is blank, and the src of an image on http://www.foo.com/Zope/page constructed with it would resolve to http://www.foo.com/image.gif, rather than http://www.foo.com/Zope/image.gif. This is not a contrived example -- people are doing this.
SCRIPT_NAME will work in simple cases, but BASE1 ought to work in all cases, and using it is a better habit to have in general.
We better file a Collector item on this then, as the current Zope Management Interface uses it still. -- Martijn Pieters | Software Engineer mailto:mj@digicool.com | Digital Creations http://www.digicool.com/ | Creators of Zope http://www.zope.org/ | ZopeStudio: http://www.zope.org/Products/ZopeStudio -----------------------------------------------------
From: Martijn Pieters <mj@digicool.com>
SCRIPT_NAME will work in simple cases, but BASE1 ought to work in all cases, and using it is a better habit to have in general.
We better file a Collector item on this then, as the current Zope Management Interface uses it still.
Done. I also tacked on a proposal to add BASE_PATHn and URL_PATHn variables to ease the transition. Cheers, Evan @ digicool & 4-am
participants (5)
-
Chris Withers -
Evan Simpson -
Kevin Howe -
Martijn Pieters -
Performance.net Strategic Internet Solutions