Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/django/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在Django通用视图中安装自定义上载处理程序?_Django_File Upload_Upload_Django Generic Views - Fatal编程技术网

如何在Django通用视图中安装自定义上载处理程序?

如何在Django通用视图中安装自定义上载处理程序?,django,file-upload,upload,django-generic-views,Django,File Upload,Upload,Django Generic Views,为了提供文件上传的进度反馈,我需要为特定视图安装一个自定义上传处理程序。这是为“经典”Django视图记录的 但是,我找不到任何说明,我提出了以下建议: 来自django.utils import importlib的 从django.core.exceptions导入配置不正确 从django.views.decorators.csrf导入csrf\u protect 类UploadHandlerMixin(对象): ''' Django通用视图的mixin,它在 上载处理程序的当前链。 您

为了提供文件上传的进度反馈,我需要为特定视图安装一个自定义上传处理程序。这是为“经典”Django视图记录的

但是,我找不到任何说明,我提出了以下建议:

来自django.utils import importlib的

从django.core.exceptions导入配置不正确
从django.views.decorators.csrf导入csrf\u protect
类UploadHandlerMixin(对象):
'''
Django通用视图的mixin,它在
上载处理程序的当前链。
您可以通过覆盖的“upload\u handler”属性来指定要安装的处理程序
类,以“path.to.module.class”的形式指定模块和类名:
类MyView(UploadHandlerMixin,视图):
upload_handler='path.to.module.MyUploadHandler'
如果您不重写“上载处理程序”,则不会生成其他上载处理程序
安装。
如果安装了CsrfViewMiddleware(默认设置),则必须使用
您的URL.py中的视图如下所示:
从django.views.decorators.csrf导入csrf_豁免
url(r'^…/$',csrf_豁免(MyView.as_view()),…),
在内部,UploadHandlerMixinMixin将安装上载处理程序,然后
执行CSRF检查。(这是必要的,因为CSRF检查
无法更改request.POST和之后的上载处理程序,请参阅文档
链接如下。)
按照Django文档“修改上载处理程序”中的说明安装处理程序
在飞行中”,见https://docs.djangoproject.com/en/dev/topics/http/file-uploads/#modifying-动态上载处理程序
'''
上载\u处理程序=无
def调度(自我、请求、*args、**kwargs):
如果不是self.upload\u处理程序为None:
request.upload\u handlers.insert(0,UploadHandlerMixin.\u实例化\u upload\u handler(self.upload\u handler,request))
return\u uploadhandler\u dispatch(请求、self、*args、**kwargs)
@静力学方法
def_实例化上传处理程序(路径,*args,**kwargs):
i=路径.rfind('.'))
模块,attr=path[:i],path[i+1:]
尝试:
mod=importlib.import\u模块(模块)
除此之外,e:
raise配置不正确('导入上载处理程序模块%s时出错:“%s”%”(模块,e))
除ValueError外,e:
raise配置不正确('导入上载处理程序模块时出错。文件\u upload\u处理程序是否是正确定义的列表或元组?')
尝试:
cls=getattr(mod,attr)
除属性错误外:
raise配置不正确('模块“%s”未定义“%s”上载处理程序后端“%”(模块,属性))
返回cls(*args,**kwargs)
@保护
def_uploadhandler_分派(请求、视图、*args、**kwargs):
return super(UploadHandlerMixin,view).dispatch(请求,*args,**kwargs)

这是完成任务的“推荐方式”吗?安全性方面可以吗?

回答我自己,服务端解决方案(如带有自定义上载处理程序的Django)的替代方案是客户端解决方案,如。它利用了一个事实,即最近的浏览器允许在客户端上读取上传进度。在我的例子中,这更易于实现,不会导致额外的服务器负载。

我还将此发布到Django用户组: