【问题标题】:How to fetch Salesforce Attachment file content with django-salesforce?如何使用 django-salesforce 获取 Salesforce 附件文件内容?
【发布时间】:2017-09-04 10:06:57
【问题描述】:

我正在开发一个 Django 1.11 应用程序,用作一些 Salesforce 对象的 UI,使用 django-salesforce 与 Salesforce 通信。

我必须让用户选择从与其联系人相关的 Salesforce 附件对象下载文件。

# Django Attachment model on my_app/models.py

...

class Attachment(models.Model):
    parent = models.ForeignKey(Contact, models.DO_NOTHING,
                               sf_read_only=models.NOT_UPDATEABLE)
    name = models.CharField(max_length=255, verbose_name='File Name')
    content_type = models.CharField(max_length=120, blank=True, null=True)
    body_length = models.IntegerField(sf_read_only=models.READ_ONLY)
    body = models.TextField()

...

在此附件模型上,我可以访问 body 字段中文件内容的其余 URL,但不能访问实际内容。

有没有一种方法可以从附件中获取文件内容,而不必为此实现 OAuth 客户端?

【问题讨论】:

  • 请编辑您的问题,编写您的附件模型、查询和您所看到的意外输出,一般来说可以理解:“从我所看到的”。出于示例的目的,信息可以被简化,但应该存在。最好用您正在做/尝试的内容替换最初的单词“基本上我需要”。您可以从 SO 网站上的一些成功问题或help 中获得启发。这可能就是这个问题被否决并标记为关闭的原因。
  • @hynecer 谢谢你的建议,我希望现在更好

标签: python django salesforce beatbox django-salesforce


【解决方案1】:

A)handle_api_exceptions封装的REST API请求

from salesforce.backend.driver import handle_api_exceptions
# from salesforce.dbapi.driver import handle_api_exceptions  # can be changed soon to this
from django.db import connections

session = connections['salesforce'].sf_session
rows = Attachment.objects.filter(...)
for row in rows:
    url = session.auth.instance_url + row.body
    blob = handle_api_exceptions(url, session.get).text

B)您可以通过

获取SOAP客户端(需要Beatbox)
from salesforce.utils import get_soap_client
import base64

soap = get_soap_client('salesforce')
for ...:
    ret = soap.query("SELECT Body FROM Attachment WHERE Id = '...'")
    blob = base64.b64decode(ret)[0]['Body'])

有用的相关答案是:

编辑 我希望您的意思是用户 = 一些联系人,而不是与 SFDC 对象相关的联系人 具有某种形式的付费许可证的用户。出于安全原因,它们只能通过您的站点下载,而不是直接下载。任何 OAuth 都可能无法改进它。

【讨论】:

  • 与 REST API 配合得很好,谢谢!不过,请注意,也许您指的是 django-salesforce 的不同版本,但它不应该是 from salesforce.backend.driver import handle_api_exceptions 吗?
  • 是的,现在是salesforce.backend.driver,很快就会改成salesforce.dbapi.driver
  • 关于您的编辑,门户网站上的用户将作为 Salesforce 上的联系人进行跟踪
【解决方案2】:

Salesforce 有一个专用端点来流式传输文件

{{endpoint}}/services/data/v{{version}}/connect/files/{{file_id}}/content

参数:

  1. 端点:实例 URL
  2. 版本:API 版本
  3. file_id: contentDocument 记录id

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-12-23
    • 2013-08-30
    • 1970-01-01
    • 2011-11-22
    • 2018-12-11
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多