基于Django(Python)集成DocuSign API:编辑视图控制及签发送开发问询
嘿,我来帮你一步步实现这个需求!结合django-docusign模块和DocuSign REST API的能力,完全可以搞定发送者编辑标签、限制签署权限,还有启用/禁用编辑视图的功能,具体步骤如下:
一、先搞定基础配置
首先确保django-docusign在你的Django项目里配置正确,在settings.py里填写DocuSign的认证信息(注意别硬编码敏感令牌,后面会说更安全的OAuth方式):
# settings.py DOCUSIGN_INTEGRATION_KEY = '你的集成密钥' DOCUSIGN_USER_ID = '你的DocuSign账户用户ID' DOCUSIGN_ACCOUNT_ID = '你的DocuSign账户ID' DOCUSIGN_BASE_URL = 'https://demo.docusign.net/restapi' # 测试环境用这个,生产环境换www.docusign.net # 推荐用OAuth授权流程获取令牌,而非硬编码 DOCUSIGN_OAUTH_TOKEN = '临时测试令牌' # 正式环境用自动刷新的令牌机制
二、实现「上传文档 + Web GUI编辑标签(仅编辑不签署)」核心流程
这是最关键的部分,要让用户A能上传文档后,跳转到DocuSign的Web编辑器加标签,但不能签署文档:
- 创建草稿信封并设置权限
当用户A上传PDF后,先创建一个草稿状态的信封,同时明确限制发送者的权限——只能编辑标签,不能签署:
from docusign import Envelope, Document, Signer def upload_and_prepare_envelope(request): if request.method == 'POST': uploaded_file = request.FILES['pdf_file'] # 1. 构建文档对象 doc = Document( name=uploaded_file.name, document_id='1', file_content=uploaded_file.read() ) # 2. 添加最终签署者信息(后续要接收文档的人) signer = Signer( email='signer@example.com', name='签署者姓名', recipient_id='1', routing_order='1' ) # 3. 创建草稿信封,核心权限设置: envelope = Envelope( documents=[doc], recipients={'signers': [signer]}, status='created', # 设为草稿,暂不发送 sender_can_sign=False, # 关键!禁止发送者签署文档 allow_edit=True # 允许发送者编辑标签 ) # 保存信封到DocuSign平台 envelope.save() # 跳转到下一步:获取编辑视图URL return redirect('get_docusign_editor', envelope_id=envelope.id) return render(request, 'upload_document.html')
- 生成DocuSign编辑视图URL并跳转
创建草稿信封后,生成Sender View的URL,让用户A跳转到DocuSign的Web界面编辑标签:
def get_docusign_editor(request, envelope_id): envelope = Envelope.objects.get(id=envelope_id) # 设置编辑完成后跳转回你的Django应用的URL return_url = f"{request.scheme}://{request.get_host()}/envelope/complete/{envelope_id}/" # 生成DocuSign的编辑页面URL editor_url = envelope.create_sender_view(return_url) # 重定向到DocuSign的Web编辑器 return redirect(editor_url)
这样用户A打开的DocuSign界面里,只能添加各类标签(签名框、文本框等),看不到签署按钮,完美符合你的需求。
三、实现启用/禁用编辑视图的功能
你可以从Django权限控制和DocuSign API权限两个层面来实现开关:
1. Django层面的前端/权限开关
在你的Django模型里给信封加一个allow_edit布尔字段,控制用户能不能进入编辑界面:
# models.py from django.db import models class EnvelopeRecord(models.Model): docusign_envelope_id = models.CharField(max_length=100) allow_edit = models.BooleanField(default=True) # 其他字段:上传用户、创建时间等
然后在生成编辑视图URL的函数里做判断:
def get_docusign_editor(request, envelope_id): envelope_rec = EnvelopeRecord.objects.get(docusign_envelope_id=envelope_id) if not envelope_rec.allow_edit: return HttpResponseForbidden('当前文档的编辑功能已禁用') # 后续生成URL的逻辑不变 envelope = Envelope.objects.get(id=envelope_id) return_url = f"{request.scheme}://{request.get_host()}/envelope/complete/{envelope_id}/" editor_url = envelope.create_sender_view(return_url) return redirect(editor_url)
这样通过后台修改allow_edit字段,就能快速开关编辑功能。
2. DocuSign API层面的强制限制
如果需要更严格的控制(比如防止用户通过其他方式访问编辑界面),可以动态设置信封的sender_can_edit参数:
- 创建信封时根据开关设置:
# 假设allow_edit_flag是从后台获取的开关值(True/False) envelope = Envelope( documents=[doc], recipients={'signers': [signer]}, status='created', sender_can_sign=False, sender_can_edit=allow_edit_flag # 动态控制是否允许编辑 ) envelope.save()
- 后续也可以更新已存在的信封权限:
envelope = Envelope.objects.get(id=envelope_id) envelope.sender_can_edit = False # 禁用编辑 envelope.save()
四、编辑完成后的收尾:发送文档给签署者
当用户A在DocuSign里完成标签编辑后,会跳转到你设置的return_url,这时候把信封状态从草稿改为已发送,签署者就会收到邮件通知:
def envelope_edit_complete(request, envelope_id): envelope = Envelope.objects.get(id=envelope_id) # 将信封状态改为"已发送" envelope.status = 'sent' envelope.save() # 跳转到成功页面,或者给用户A发送通知 return render(request, 'envelope_sent_success.html', {'envelope': envelope})
几个注意点
- OAuth令牌管理:正式环境别硬编码令牌,用django-docusign的OAuth授权码流程,实现令牌自动刷新,避免过期问题。
- 环境区分:测试用
demo.docusign.net,生产用www.docusign.net,记得更换DOCUSIGN_BASE_URL。 - 文档兼容性:确保上传的PDF没有加密,否则DocuSign无法解析编辑。
内容的提问来源于stack exchange,提问作者Lucid Lynx
相关产品推荐
相关产品推荐

