Are you using nginx by any chance? I use nginx and my setup is as follows: A upload.py with the custom handler and a view to yield progress result as json [1], a template with some javascript [2] to fetch the json-formatted progress result, some lines in nginx.conf [3] to tell it to keep track of uploads (nginx must be compiled with HttpUploadProgressModule [4]) and a bit of patience to get it up and running.
I have compiled nginx for windows with that additional module. The instructions are pretty much gone at this point, but I can zip the binaries and send it your way should you need them. You will also notice that I use a /projects/mysite/mysite layout for my django projects, which is consistent with the new layout in 1.4/trunk [5]. I almost forgot! I'm also using a custom JSONMixin which calls get_data() on ajax requests in any view that implements it and returns self.data (to be set by self.get_data) as json [6]. Best of luck! Cheers, AT [1] http://dpaste.com/hold/641334/ [2] http://dpaste.com/hold/641337/ [3] http://dpaste.com/hold/641339/ [4] http://wiki.nginx.org/HttpUploadProgressModule [5] https://docs.djangoproject.com/en/dev/intro/tutorial01/#creating-a-project [6] http://dpaste.com/hold/641344/ On Wed, Oct 26, 2011 at 9:21 AM, hbf <kaspar.fisc...@dreizak.com> wrote: > Dear all, > > In order to provide progress feedback of file uploads I needed to > install an upload handler for a specific view. This is documented for > "classical" views at > > > https://docs.djangoproject.com/en/dev/topics/http/file-uploads/#modifying-upload-handlers-on-the-fly > > For generic views, however, I could not find any instructions and I > came up with the following, which I would like to share: > > # BEGIN OF CLASS > from django.utils import importlib > from django.core.exceptions import ImproperlyConfigured > from django.views.decorators.csrf import csrf_protect > > class UploadHandlerMixin(object): > ''' > A mixin for Django generic views that installs a custom upload > handler in front of > the current chain of upload handlers. > > You specify the handler to install by overriding the > 'upload_handler' attribute of > the class, specifying the module and class name in the form > 'path.to.module.class': > > class MyView(UploadHandlerMixin, View): > upload_handler = 'path.to.module.MyUploadHandler' > > If you do not override 'upload_handler', no additional upload > handler will be > installed. > > If the CsrfViewMiddleware is installed (which is the default) > then you must use > your view as follows in your urls.py: > > from django.views.decorators.csrf import csrf_exempt > url(r'^.../$', csrf_exempt(MyView.as_view()), ...), > > Internally, the UploadHandlerMixin mixin will install the > upload handler and then > perform the CSRF check. (This is necessary because the CSRF > check inspects > request.POST, and afterwards upload handlers cannot be > changed, see documentation > link given below.) > > The handler is installed as described in the Django > documentation "Modifying upload handlers > on the fly", see > > https://docs.djangoproject.com/en/dev/topics/http/file-uploads/#modifying-upload-handlers-on-the-fly > ''' > > upload_handler = None > > def dispatch(self, request, *args, **kwargs): > if not self.upload_handler is None: > request.upload_handlers.insert(0, > UploadHandlerMixin._instantiate_upload_handler(self.upload_handler, > request)) > return _uploadhandler_dispatch(request, self, *args, **kwargs) > > @staticmethod > def _instantiate_upload_handler(path, *args, **kwargs): > i = path.rfind('.') > module, attr = path[:i], path[i+1:] > try: > mod = importlib.import_module(module) > except ImportError, e: > raise ImproperlyConfigured('Error importing upload handler > module %s: "%s"' % (module, e)) > except ValueError, e: > raise ImproperlyConfigured('Error importing upload handler > module. Is FILE_UPLOAD_HANDLERS a correctly defined list or tuple?') > try: > cls = getattr(mod, attr) > except AttributeError: > raise ImproperlyConfigured('Module "%s" does not define a > "%s" upload handler backend' % (module, attr)) > return cls(*args, **kwargs) > > @csrf_protect > def _uploadhandler_dispatch(request, view, *args, **kwargs): > return super(UploadHandlerMixin, view).dispatch(request, *args, > **kwargs) > # END OF CLASS > > Not being a Django expert, I wanted to ask whether this is okay > security-wise? Any other feedback is of course welcome. > > Best, > Kaspar > > P.S. I opened a question at stackoverflow, > > > http://stackoverflow.com/questions/7901895/how-to-install-a-custom-upload-handler-in-a-django-generic-view > > and will keep both this thread and the latter post updated. > > -- > You received this message because you are subscribed to the Google Groups > "Django users" group. > To post to this group, send email to django-users@googlegroups.com. > To unsubscribe from this group, send email to > django-users+unsubscr...@googlegroups.com. > For more options, visit this group at > http://groups.google.com/group/django-users?hl=en. > > -- You received this message because you are subscribed to the Google Groups "Django users" group. To post to this group, send email to django-users@googlegroups.com. To unsubscribe from this group, send email to django-users+unsubscr...@googlegroups.com. For more options, visit this group at http://groups.google.com/group/django-users?hl=en.