App Engine上的金字塔gets“InvalidResponseError:头值必须是str,得到的是unicode”

2024-04-26 09:49:27 发布

您现在位置:Python中文网/ 问答频道 /正文

我在OSX10.7.3上使用Pyramid1.3和Appengine1.6.4SDK。我使用的是python2.7,并在中实现了threadsafe应用程序yaml. 在

@view_config(route_name='manager_swms', permission='manager', renderer='manager/swms.jinja2')
def manager_swms(request):
    """Generates blobstore url and passes users swms in swms table"""

    # generate url for any form upload that may occur
    upload_url = blobstore.create_upload_url('/upload_swm')

    user = get_current_user(request)
    swms = DBSession.query(SWMS).filter_by(owner_id=int(user.id)).all()

    return {
        "analytics_id": analytics_id,
        "user": get_current_user(request),
        "upload_url": upload_url,
        "swms": [(x.filename, x.blob_key) for x in swms]
    }

class BlobstoreUploadHandler(object):
    """Base class for creation blob upload handlers."""

    def __init__(self, *args, **kwargs):
        self.__uploads = None

    def get_uploads(self, field_name=None):
        """Get uploads sent to this handler.

        Args:
          field_name: Only select uploads that were sent as a specific field.

        Returns:
          A list of BlobInfo records corresponding to each upload.
          Empty list if there are no blob-info records for field_name.
        """
        if self.__uploads is None:
            self.__uploads = {}
            for key, value in self.request.params.items():
                if isinstance(value, cgi.FieldStorage):
                    if 'blob-key' in value.type_options:
                        self.__uploads.setdefault(key, []).append(
                            blobstore.parse_blob_info(value))

        if field_name:
            try:
                return list(self.__uploads[field_name])
            except KeyError:
                return []
        else:
            results = []
            for uploads in self.__uploads.itervalues():
                results += uploads
            return results

@view_config(route_name='upload_swm', permission='manager')
class UploadHandler(BlobstoreUploadHandler):
    ''' Handles redirects from Blobstore uploads. '''

    def __init__(self, request):
        self.request = request
        super(UploadHandler, self).__init__()

    def __call__(self):

        user = get_current_user(self.request)
        for blob_info in self.get_uploads('file'):

            new_swm = SWMS(
                owner_id = int(user.id),
                blob_key = str(blob_info.key()),
                filename = blob_info.filename,
                size = blob_info.size,
            )
            DBSession.add(new_swm)
        DBSession.flush()

        # redirect to swms page
        return HTTPFound(location='/manager/swms')

在上面的代码中,manager_swms()生成一个页面,其中包含一个用于将文件上载到Blobstore的表单。表单工作正常,当使用表单时,我可以看到blob出现在Blobstore中。然后从blobstore POST重定向到/upload_swm,在那里我成功地获取BlobInfo详细信息并将它们放入SQL表中。所有这些都是好的,我想做的最后一件事是重定向到第一页,这样可以上传另一个文件,如果需要的话,我可以显示上传的文件列表。在

根据金字塔文档,我使用HTTPFound(location='/manager/swms')[原始页面URL]尝试重定向,但是我得到:

^{pr2}$

AppEngine显然反对在HTTP头中使用unicode,但我并没有做任何异常的事情。如果我进入pdb并查看HTTPFound对象,那么标题是:

ResponseHeaders([('Content-Type', 'text/html; charset=UTF-8'), ('Content-Length', '0'), ('Location', '/manager/swms')])

为什么我会从这些文件中得到unicode问题?在


Tags: keynameinselfidurlfieldfor
2条回答

因此,您似乎重写了appengine支持的webob,它是2.7 runtime.上的1.1.1,而pyramid 1.3依赖于webob>;=1.2。这很可能是问题所在,因为在sdk1.6.4发布之前,是Blobstore处理程序使sdk保持在webob==0.9的水平。在

FWIW,这个问题有望在sdk1.6.5(4月底)得到解决。我知道这一点的唯一原因是,当2.7运行时被认为可以通用时,我试图解决所有这些垃圾问题,但是SDK不支持它。有关详细信息,请参阅此issue。在

如果可能的话,我建议用Pyramid1.2来运行它,我知道它在appengine上运行得很好。再等几周再改为1.3。:)

另一个答案。。。添加str()可以解决问题,但不能解决根本原因。我花了好几个小时试图弄清楚为什么一个特定的重定向会引发这个错误,而其他的却没有,直到发现错误重定向的URL缺少了首字母“/”。在

我不知道为什么会出现这种情况-不完整路径的处理方式可能与完整路径不同。但如果遇到此错误,请尝试更改:

self.redirect('home.view')

收件人:

^{pr2}$

相关问题 更多 >