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 - 如何在上传前检查文件大小?