django storages FTP NotImplementedError(存在方法)

Posted

技术标签:

【中文标题】django storages FTP NotImplementedError(存在方法)【英文标题】:django storages FTP NotImplementedError (exists method) 【发布时间】:2016-06-20 19:57:36 【问题描述】:

我正在尝试将文件保存在 FTP 服务器中。起初,我有this error,该链接作为最小示例也很有用。它在本地对我有用,但是在我将它部署到 heroku 之后,我不知道我改变了什么,但它停止工作并抛出此错误:

/app/new-prof 处的 NotImplementedError

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

Here is the ftp.py code,exists 方法在线~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

完整的回溯

get_response 中的文件“C:\Users\myuser\Envs\iepvenv\lib\site-packages\django\core\handlers\base.py” 149. response = self.process_exception_by_middleware(e, request)

get_response 中的文件“C:\Users\myuser\Envs\iepvenv\lib\site-packages\django\core\handlers\base.py” 147. response = Wrapped_callback(request, *callback_args, **callback_kwargs)

_wrapped_view 中的文件“C:\Users\myuser\Envs\iepvenv\lib\site-packages\django\contrib\auth\decorators.py” 23. return view_func(request, *args, **kwargs)

_wrapped_view 中的文件“C:\Users\myuser\Envs\iepvenv\lib\site-packages\django\contrib\auth\decorators.py” 23. return view_func(request, *args, **kwargs)

new_prof 中的文件“C:\Users\myuser\Desktop\Cosas\directorio\iep\directorio\views.py” 305. new_prof = pform.save()

保存文件“C:\Users\myuser\Envs\iepvenv\lib\site-packages\django\forms\models.py” 451. self.instance.save()

保存文件“C:\Users\myuser\Envs\iepvenv\lib\site-packages\django\db\models\base.py” 700. force_update=force_update, update_fields=update_fields)

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

_save_table 中的文件“C:\Users\myuser\Envs\iepvenv\lib\site-packages\django\db\models\base.py” 812. 结果 = self._do_insert(cls._base_manager, using, fields, update_pk, raw)

_do_insert 中的文件“C:\Users\myuser\Envs\iepvenv\lib\site-packages\django\db\models\base.py” 851. 使用=使用,原始=原始)

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

_insert 中的文件“C:\Users\myuser\Envs\iepvenv\lib\site-packages\django\db\models\query.py” 1039. return query.get_compiler(using=using).execute_sql(return_id)

execute_sql 中的文件“C:\Users\myuser\Envs\iepvenv\lib\site-packages\django\db\models\sql\compiler.py” 1059.对于sql,self.as_sql()中的参数:

as_sql 中的文件“C:\Users\myuser\Envs\iepvenv\lib\site-packages\django\db\models\sql\compiler.py” 1019. 对于self.query.objs中的obj

文件“C:\Users\myuser\Envs\iepvenv\lib\site-packages\django\db\models\sql\compiler.py”在 1019. 对于self.query.objs中的obj

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

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

pre_save 中的文件“C:\Users\myuser\Envs\iepvenv\lib\site-packages\django\db\models\fields\files.py” 311. file.save(file.name, file, save=False)

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

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

get_available_name 中的文件“C:\Users\myuser\Envs\iepvenv\lib\site-packages\django\core\files\storage.py” 89. while self.exists(name) or (max_length and len(name) > max_length):

文件“C:\Users\myuser\Envs\iepvenv\lib\site-packages\django\core\files\storage.py”存在 130. raise NotImplementedError('Storage的子类必须提供exists()方法')

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

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

【问题讨论】:

我没有正确解释,它也停止在开发中工作。我会编辑它。无论如何,我已经检查过它们运行的​​是相同的版本。 【参考方案1】:

解决了!

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

【讨论】:

以上是关于django storages FTP NotImplementedError(存在方法)的主要内容,如果未能解决你的问题,请参考以下文章

13华为HCIE-Storage--文件协议 CIFS NFS FTP HTTP

使用 azure 作为 Django 的存储后端(使用 django-storages)

Django:使用 django-storage 从 S3 创建 zipfile

Django-storage - 如何在上传前检查文件大小?

Django-storages + boto + S3 collectstatic 的最小凭据

Django-storages 未检测到更改的静态文件