django storages FTP NotImplementedError(exists方法)

时间:2016-03-07 10:05:01

标签: python django ftp django-storage

我试图在FTP服务器中保存文件。起初,我有this error,该链接也是最有用的例子。它在我当地工作,但在我将它部署到heroku之后,我不知道我改变了什么,但它停止了工作并抛出了这个错误:

中的

NotImplementedError

Storage的子类必须提供exists()方法

Here is the ftp.py code,一个存在方法在线~200。有用的代码(如果需要,请说):

settings.py

Installed Applications:
[...
 'django.contrib.staticfiles',
 'directorio.apps.myapp',
 'django_cleanup',
 'storages']

FTP_USER = os.environ['FTP_USER']
FTP_PASS = os.environ['FTP_PASS']
FTP_PORT = os.environ['FTP_PORT']
DEFAULT_FILE_STORAGE = 'storages.backends.ftp.FTPStorage'
FTP_STORAGE_LOCATION = 'ftp://' + FTP_USER + ':' + FTP_PASS + '@<server>:' + FTP_PORT

models.py

from app.ftp import FTPStorage
fs = FTPStorage()

def upload_path_handler(instance, filename): 
     return "{id_p}/{f}".format(id_p=instance.id, f=filename)

class Professor(models.Model):
  name = models.CharField(max_length=100)
  email = models.EmailField(max_length=75)
  foto = models.ImageField(upload_to=upload_path_handler, null=True, blank=True, storage=fs)
  cv = models.FileField(upload_to=upload_path_handler, null=True, blank=True, storage=fs)

forms.py

class ProfessorForm(forms.ModelForm):
  class Meta:
      model = Professor
      exclude = ['name']

views.py

def nuevo_profesor(request):

if request.method == 'POST':
    pform = ProfessorForm(request.POST, request.FILES)

    if pform.is_valid():
        new_prof = pform.save()

        return redirect('app:professor', new_prof.id)

回溯

  

NotImplementedError

     

Storage的子类必须提供exists()方法

     

请求方法:POST

     

请求网址:http://127.0.0.1:8000/

     

Django版本:1.9.2

     

异常类型:NotImplementedError

     

异常值:Storage的子类必须提供exists()方法

     

异常位置:C:\ Users \ myuser \ Envs \ iepenv \ lib \ site-packages \ django \ core \ files \ storage.py in exists,第130行

     

Python可执行文件:C:\ Users \ myuser \ Envs \ iepenv \ Scripts \ python.exe

     

Python版本:3.4.3

     

Django版本:1.9.2

完全追溯

  

文件&#34; C:\ Users \ myuser \ Envs \ iepvenv \ lib \ site-packages \ django \ core \ handlers \ base.py&#34;在get_response中     149. response = self.process_exception_by_middleware(e,request)

     

文件&#34; C:\ Users \ myuser \ Envs \ iepvenv \ lib \ site-packages \ django \ core \ handlers \ base.py&#34;在get_response中     147. response = wrapped_callback(request,* callback_args,** callback_kwargs)

     

文件&#34; C:\ Users \ myuser \ Envs \ iepvenv \ lib \ site-packages \ django \ contrib \ auth \ decorators.py&#34;在_wrapped_view中     23. return view_func(request,* args,** kwargs)

     

文件&#34; C:\ Users \ myuser \ Envs \ iepvenv \ lib \ site-packages \ django \ contrib \ auth \ decorators.py&#34;在_wrapped_view中     23. return view_func(request,* args,** kwargs)

     

文件&#34; C:\ Users \ myuser \ Desktop \ Cosas \ directorio \ iep \ directorio \ views.py&#34;在new_prof     305. new_prof = pform.save()

     

文件&#34; C:\ Users \ myuser \ Envs \ iepvenv \ lib \ site-packages \ django \ forms \ models.py&#34;在保存     451. self.instance.save()

     

文件&#34; C:\ Users \ myuser \ Envs \ iepvenv \ lib \ site-packages \ django \ db \ models \ base.py&#34;在保存     700. force_update = force_update,update_fields = update_fields)

     

文件&#34; C:\ Users \ myuser \ Envs \ iepvenv \ lib \ site-packages \ django \ db \ models \ base.py&#34;在save_base中     728.更新= self._save_table(raw,cls,force_insert,force_update,using,update_fields)

     

文件&#34; C:\ Users \ myuser \ Envs \ iepvenv \ lib \ site-packages \ django \ db \ models \ base.py&#34;在_save_table中     812. result = self._do_insert(cls._base_manager,using,fields,update_pk,raw)

     

文件&#34; C:\ Users \ myuser \ Envs \ iepvenv \ lib \ site-packages \ django \ db \ models \ base.py&#34;在_do_insert中     851. using = using,raw = raw)

     

文件&#34; C:\ Users \ myuser \ Envs \ iepvenv \ lib \ site-packages \ django \ db \ models \ manager.py&#34;在manager_method中     122. return getattr(self.get_queryset(),name)(* args,** kwargs)

     

文件&#34; C:\ Users \ myuser \ Envs \ iepvenv \ lib \ site-packages \ django \ db \ models \ query.py&#34;在_insert中     1039. return query.get_compiler(using = using).execute_sql(return_id)

     

文件&#34; C:\ Users \ myuser \ Envs \ iepvenv \ lib \ site-packages \ django \ db \ models \ sql \ compiler.py&#34;在execute_sql中     1059.对于sql,self.as_sql()中的params:

     

文件&#34; C:\ Users \ myuser \ Envs \ iepvenv \ lib \ site-packages \ django \ db \ models \ sql \ compiler.py&#34;在as_sql中     1019.对于obj in self.query.objs

     

文件&#34; C:\ Users \ myuser \ Envs \ iepvenv \ lib \ site-packages \ django \ db \ models \ sql \ compiler.py&#34;在     1019.对于obj in self.query.objs

     

文件&#34; C:\ Users \ myuser \ Envs \ iepvenv \ lib \ site-packages \ django \ db \ models \ sql \ compiler.py&#34;在     1018. [self.prepare_value(field,self.pre_save_val(field,obj))for field in field]

     

文件&#34; C:\ Users \ myuser \ Envs \ iepvenv \ lib \ site-packages \ django \ db \ models \ sql \ compiler.py&#34;在pre_save_val中     968. return field.pre_save(obj,add = True)

     

文件&#34; C:\ Users \ myuser \ Envs \ iepvenv \ lib \ site-packages \ django \ db \ models \ fields \ files.py&#34;在pre_save中     311. file.save(file.name,file,save = False)

     

文件&#34; C:\ Users \ myuser \ Envs \ iepvenv \ lib \ site-packages \ django \ db \ models \ fields \ files.py&#34;在保存     93. self.name = self.storage.save(name,content,max_length = self.field.max_length)

     

文件&#34; C:\ Users \ myuser \ Envs \ iepvenv \ lib \ site-packages \ django \ core \ files \ storage.py&#34;在保存     53. name = self.get_available_name(name,max_length = max_length)

     

文件&#34; C:\ Users \ myuser \ Envs \ iepvenv \ lib \ site-packages \ django \ core \ files \ storage.py&#34;在get_available_name中     89.而self.exists(name)或(max_length和len(name)&gt; max_length):

     

文件&#34; C:\ Users \ myuser \ Envs \ iepvenv \ lib \ site-packages \ django \ core \ files \ storage.py&#34;在存在     130.引发NotImplementedError(&#39;存储的子类必须提供exists()方法&#39;)

     

异常类型:NotImplementedError at /   异常值:Storage的子类必须提供exists()方法

有什么想法?或者你能建议我采用其他方法吗?

1 个答案:

答案 0 :(得分:0)

解决!

Due to an issue,我在ftp.py中添加了一个@deconstructible类装饰器,我没有正确添加它。我在代码的末尾添加了the example function explained here,但装饰器必须在“类FTPStorage(存储)”之前编写,(ftp.py中的第31行我链接到原帖)。