【问题标题】:Can django-piston module create upload image restful webservicedjango-piston模块可以创建上传图片restful webservice吗
【发布时间】:2011-02-19 17:12:51
【问题描述】:

我正在尝试一个可以上传图片的安静服务器,通过使用 django-piston 我可以安静地放置、获取、发布信息,但不知道如何上传图片。

【问题讨论】:

  • 抱歉缺少细节。我需要使用 django-piston 创建可以上传图像并返回图像的 id 和 url 的 restful 网络服务,可以这样做吗?

标签: django django-piston


【解决方案1】:

差不多。

从技术上讲,它只是一个 http 帖子。

【讨论】:

    【解决方案2】:

    一方面,是的。如果您有图像数据,则可以通过 post 将其发送到知道如何处理它的处理程序;如果你做得对,理论上它应该在 request.FILES 中提供给你的处理程序。简单的 HTTP。

    另一方面,没有。为了进行这样的 AJAX 上传,您必须以某种方式获取图像数据,而无需用户实际提交表单。这就是为什么“ajax 上传表单”如此难以实现的原因,并且通常使用隐藏 iframe 之类的技巧来完成它们的工作。

    据我所知,只有 Firefox 及其 gecko kin 允许通过 File object'sgetAsBinary() 方法对文件字段的二进制内容进行这种访问。

    【讨论】:

      【解决方案3】:

      您当然可以进行 POST。文件将在 request.FILES 中可用(活塞不会妨碍这样做)。

      为了执行 PUT,我们必须对活塞进行一些更改以支持 x-method-override 标头。这就是我允许从闪存中进行 PUT 和 DEL 的操作。 (不要忘记在执行 POST 时添加标题以使其被解释为 PUT)

      这是一些示例中间件:

      class x_http_methodoverride_middleware():
          def process_request(self, request):
              if 'HTTP_X_HTTP_METHODOVERRIDE' in request.META:
                  newMethod = request.META['HTTP_X_HTTP_METHODOVERRIDE']
                  if 'PUT' == newMethod.upper():
                      request.method = 'PUT'
                      request.META['REQUEST_METHOD'] = 'PUT'
                      request.PUT = request.POST                
                  if 'DELETE' == newMethod.upper() or 'DEL' == newMethod.upper():
                      request.method = 'DELETE'
                      request.META['REQUEST_METHOD'] = 'DELETE'
                      request.DELETE = request.POST
      

      (代码来自此处的开放式活塞票http://bitbucket.org/jespern/django-piston/issue/83/use-x-http-method-override-to-override-put

      【讨论】:

        【解决方案4】:

        你可以在这里找到两个答案:http://groups.google.com/group/django-piston/browse_thread/thread/6f3f964b8b3ccf72/bd1658121bb1874c?show_docid=bd1658121bb1874c&pli=1

        一种方法是使用 request.FILES 获取文件名,然后保存图片:

        def create(self, request, nickname): 
            name = request.FILES["image"].name 
            image = PIL.Image.open(request.FILES["image"]) 
            image.save(SOME_PATH+name) 
            return rc.ALL_OK 
        

        第二个建议是定义一个 Image 模型和一个 ImageForm 表单,并使用它们:

        def create(self, request, nickname):
            form = ImageForm(request.POST, request.FILES)
            if form.is_valid():
                Image.objects.create(image=form.cleaned_data['image'])
                return rc.ALL_OK
            return rc.BAD_REQUEST
        

        警告:我还没有测试过这两种方法!

        【讨论】:

          猜你喜欢
          • 2012-01-15
          • 2015-12-02
          • 2011-06-27
          • 1970-01-01
          • 2012-09-15
          • 2015-05-13
          • 2012-02-02
          • 1970-01-01
          • 2010-12-06
          相关资源
          最近更新 更多