Если URL для изображения статический и нужно просто менять само
изображение, то можно сделать так:
----- configure.zcml -----
<configure
xmlns="http://namespaces.zope.org/browser">
<page
for="zope.app.container.interfaces.IContainer"
name="image.jpg"
class=".views.ImageView"
permission="zope.View"
/>
</configure>
---------------------------
------ views.py -----
from zope.publisher.browser import BrowserView
class ImageView(BrowserView):
def __call__(self):
self.request.response.setHeader("Content-Type", "image/jpg")
return self.getRawImageData()
------------------------
Потом изображение можно запросить для любой папки как image.jpg,
например: http://localhost/image.jpg
Если нужно генерировать и разные имена картинок, то лучше всего делать
траверсер как здесь уже писали.
--
Dmitry Vasiliev (dima at hlabs.spb.ru)
http://hlabs.spb.ru
Там много сообщений, но что-то похожее на ответ только в одном как я
понял? :-) Предлагается сделать <img src="/show_pic?id=id_записи_в_БД">?
Можно сделать так, в этом случае нужно просто определить метод который
будет брать передаваемый id и в итоге возвращать данные изображения и
соответствующий тип контента как и в моем примере. Т.е если поменять
метод __call__ на вот такой:
def __call__(self, id):
content_type = self.getImageContentType(id)
self.request.response.setHeader("Content-Type", content_type)
return self.getRawImageData(id)
то можно будет запрашивать картинки вот так: :-)
http://localhost/image.jpg?id=image_id
Но на мой взгляд время URL в виде /скрипт?id=идентификатор_в_базе уже
ушло и намного удобнее и правильнее делать в виде
/идентификатор_в_базе.тип, тем более если используется компонентная
архитектура. Вот для этого в Z3 лучше всего использовать траверсер
который будет перехватывать запрос дочернего объекта по имени. Например,
если есть объект со списком пользователей красивее хранить картинки
пользователей привязанными к нему, чем привязанными к скрипту.
В целом это конечно вопрос компромисса между удобством для пользователя
и разработчика. URL вида peoples/getimage?id=id проще сделать, но он
менее красивый, в тоже время peoples/id.jpg красивее, но сделать чуть
сложнее. :-)
получил ошибку:
File "/usr/local/www/Zope3/lib/python/zope/app/file/file.py", line
152, in _setData
seek = data.seek
AttributeError: Binary instance has no attribute 'seek'
если не увидите, посмотрите так:
http://localhost:8080/имя_контейнера/имя_картинки/@@introspector.html
ваша b.data долна быть там, под всевдонимом data (type: str)