【问题标题】:How should I store and retrieve images with Django on App Engine?我应该如何在 App Engine 上使用 Django 存储和检索图像?
【发布时间】:2010-12-12 15:34:01
【问题描述】:

我正在使用带有 Django 1.1 的 App Engine 补丁(附带 App Engine 补丁)。 我有一个包含多个列和多个文件的页面。 在管理员中,我希望能够上传图像并在列中写入文本,如下所示:

This is the story of bugs bunny ...
<img src="/pages/file/agphZXAtc2FtcGxlchALEgpwYWdlc19maWxlGAUM/" alt="didnt work" />
some more text about bugs bunny ...

(get_absolute_url 显示 /pages/file/agphZXAtc2FtcGxlchALEgpwYWdlc19maWxlGAUM/)

我的问题是让图像在页面上呈现,上面显示“没有工作”而不是呈现图像。 我可以转到页面、列和文件的详细信息页面。 我是否没有正确完成模型,app.yaml 是否需要一些东西,我不应该为文件的通用 URL 传递模板吗?

我的 urls.py:

urlpatterns += patterns('',
    url(r'^index/$', direct_to_template, 
        {'template': 'base.html'}, name="main-view"),

    url(r'^pages/page/(?P<object_id>.+)/$', object_detail, 
        {'queryset': Page.all(), 
         'template_name': 'pages_page_detail.html'}, name="pages_page_detail_view"),

    url(r'^pages/column/(?P<object_id>.+)/$', object_detail, 
        {'queryset': Column.all(), 
         'template_name': 'pages_column_detail.html'}, name="pages_column_detail_view"),    

    url(r'^pages/file/(?P<object_id>.+)/$', object_detail, 
        {'queryset': File.all(), 
         'template_name': 'pages_file_detail.html'}, name="pages_file_detail_view"),    

    url(r'^pages/$', object_list, 
        {'queryset': Page.all(), 'paginate_by': 3, 'template_name': 'pages_page_index.html'}, name="page_index_view"), 
)

我的models.py:

class Page(db.Model):
    """Page model."""

    title           = db.StringProperty(_('title'), required=True)
    author          = db.ReferenceProperty(User)
    status          = db.StringProperty(_('status'), choices=[_('draft'), 
                                                              _('public'),
                                                              _('hidden'),
                                                     ])                                      
    created         = db.DateTimeProperty(_('created'))
    modified        = db.DateTimeProperty(_('modified'))
    non_indexable   = db.BooleanProperty(_('hide from index'))

    def __unicode__(self):
        return '%s' % self.title

    @permalink    
    def get_absolute_url(self):
        return ('pages_page_detail_view', [self.key()])

class File(db.Model):
    """File model."""
    title           = db.StringProperty(_('title'))
    data            = db.BlobProperty()
    added           = db.DateTimeProperty(_('added'))
    page            = db.ReferenceProperty(Page)
    #content_type    = FakeModelProperty(ContentType, required=True)

    def __unicode__(self):
        return '%s' % self.get_absolute_url()

    @permalink
    def get_absolute_url(self):
        return ('pages_file_detail_view', [self.key()])

class Column(db.Model):
    """Column model."""
    title           = db.StringProperty(_('title'))
    data            = db.TextProperty(_('data'))
    page            = db.ReferenceProperty(Page)

    def __unicode__(self):
        return '%s' % self.title

    @permalink
    def get_absolute_url(self):
        return ('pages_column_detail_view', [self.key()])

我的 app.yaml:

application: aep-sample
version: 1
runtime: python
api_version: 1

default_expiration: '3650d'

handlers:
- url: /remote_api
  script: $PYTHON_LIB/google/appengine/ext/remote_api/handler.py
  secure: optional
  login: admin

- url: /media
  static_dir: _generated_media
  secure: optional

- url: /.*
  script: common/appenginepatch/main.py
  secure: optional

【问题讨论】:

  • 在我看来问题可能出在“/pages/file/agphZXAtc2FtcGxlchALEgpwYWdlc19maWxlGAUM/”中的“/”你尝试过“pages/file/...”吗?

标签: django image google-app-engine django-admin


【解决方案1】:

"/pages/file/agphZXAtc2FtcGxlchALEgpwYWdlc19maWxlGAUM/" 应该返回一个图像。据我现在从您的 urls.py 可以看出,您返回 html(必须查看模板才能确定)

这是一个可以返回具有正确 mimetype 的 JPEG 图像的视图

def get_image(request, object_id):
    file = get_object_or_404(File, pk=object_id)
    return HttpResponse(file.data, mimetype='image/jpeg')

然后把urls.py改成

url(r'^pages/file/(?P<object_id>.+)/$', get_image)

【讨论】:

    【解决方案2】:

    史蒂文,感谢您与我一起思考,不过 / 似乎是必要的。
    内森,这解决了问题。

    我做了以下更改:

    urls.py:

    url(r'^pages/file/(?P<object_id>.+)/$', 'pages.views.download_file', 
        name="pages_file_download_view"),
    

    views.py:

    def download_file(request, object_id):
        file = get_object_or_404(File, object_id)
        return HttpResponse(file.data, 
            content_type=guess_type(file.title)[0] or 'application/octet-stream')
    

    在models.py中:

    @permalink
    def get_absolute_url(self):
        return ('pages_file_download_view', [self.key()])
    

    谢谢!

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-04-20
      • 2012-06-30
      • 2010-11-09
      • 2014-11-11
      • 2011-05-07
      • 2015-01-28
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多