如何使用django-salesforce获取Salesforce Attachment文件内容?

时间:2017-09-04 10:06:57

标签: python django salesforce beatbox

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

我必须为用户提供从与其联系人相关的Salesforce Attachment对象下载文件的选项。

# 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字段上文件内容的其余网址,但不能访问实际内容。

有没有办法从附件中获取文件内容而无需为此实现OAuth客户端?

2 个答案:

答案 0 :(得分: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'])

有用的相关答案是:

编辑我希望你的意思是User = some Contact,而不是与SFDC对象有关的联系人用某种形式的付费许可。出于安全原因,他们应该只通过您的网站下载,而不是直接下载。任何OAuth都不可能改进它。

答案 1 :(得分:0)

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

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

参数:

  1. 端点:实例 URL
  2. 版本:API 版本
  3. file_id:内容文档记录 ID