首页 > 解决方案 > 如何访问 Django 中的 S3Boto3StorageFile 以上传到其他位置?

问题描述

在提交潜在客户时,我正在尝试将文件上传到我们的 CRM 管道驱动器。下面的一切都按计划工作,除了我views.py调用lead_file_upload()函数的时候。我收到以下错误:

expected str, bytes or os.PathLike object, not S3Boto3StorageFile

我假设这是我使用 AWS S3 Storage 和file_data = default_storage.open(file.file.file, 'rb')S3Boto3StorageFile 对象的结果。如何打开 S3Boto3StorageFile 对象,然后将其传递给lead_file_upload()函数?

models.py

class Lead(models.Model):
    lead_name = models.CharField(max_length=50)
    timestamp = models.DateTimeField(auto_now_add=True)
    comments = models.TextField(blank=True)
    submitted_by = models.ForeignKey(settings.AUTH_USER_MODEL, null=True, blank=True, on_delete=models.SET_NULL)

    def __str__(self):
        return self.lead_name

class LeadFile(models.Model):
    file = models.FileField(upload_to="lead/%Y/%m/%d", blank=True)
    lead = models.ForeignKey(Lead, on_delete=models.CASCADE)

forms.py

from django import forms
from django.forms import ClearableFileInput
from .models import LeadFile

class LeadForm(forms.Form):
    coop_name = forms.CharField(max_length=50,
        label = "Name of lead")
    comments =  forms.CharField(max_length=2000, widget=forms.Textarea({}), required=False)

class LeadFileModelForm(forms.ModelForm):
    class Meta:
        model = LeadFile
        fields = ['file']
        widgets = {
            'file': ClearableFileInput(attrs={'multiple': True}),
        }
        labels = {
            'file': 'Add files',
        }

views.py

def lead(request):
    title = 'Submit lead'
    user = request.user
    if request.method == 'POST':
        form = LeadForm(request.POST)
        fileform = LeadFileModelForm(request.POST, request.FILES)
        files = request.FILES.getlist('file')
        if form.is_valid() and fileform.is_valid():
            lead_name = form.cleaned_data['lead_name']
            comments = form.cleaned_data['comments']
            lead = Lead(lead_name=lead_name, comments=comments, submitted_by=user)
            lead.save()
            for f in files:
                file = LeadFile(file=f, offer=lead)
                file.save()
                file_data = default_storage.open(file.file.file, 'rb')
                lead_file_upload(file_data, offer)
                file_data.close()
            # Ship things to Pipedrive
            ship_note_to_pipedrive = lead_upload(lead)
    else:
        form = LeadForm()
        fileform = LeadFileModelForm()
    context = {'title': title, 'form': form, 'fileform': fileform}
    return render(request, 'lead.html', context)

lead_file_upload() function: _

def lead_file_upload(the_file, instance):
    headers = {'Accept': 'application/json', 'Content-Type': 'application/x-www-form-urlencoded'}
    files = {'file': the_file}
    data = {'deal_id': str(instance.lead_name)}
    pd_token = os.getenv("PIPEDRIVE_TOKEN")
    url = 'https://api.pipedrive.com/v1/files?api_token=%s' %pd_token
    r = requests.post(url, files=files, data=data, headers=headers)
    return r.status_code

标签: pythondjangoamazon-s3python-django-storages

解决方案


推荐阅读