2009-03-04 14 views

Respuesta

17

Lamentablemente no puedo darle ejemplos de código muy detallados, pero tengo bastante experiencia trabajando con SWFUpload + Django (para un sitio para compartir fotos en el que trabajo). De todos modos, aquí hay algunos consejos que esperamos le ayuden en su búsqueda de la felicidad :) DjSWF

  1. Usted querrá utilizar el plugin galletas (por supuesto, si usted está usando algún tipo de autenticación basada en sesión [como django.contrib.auth, y cuide quién subió qué).

    El plugin galletas envía los datos de las cookies como el correo, por lo que tendrá que encontrar alguna manera de conseguir esto de nuevo en request.COOKIES (process_request middleware que busca una settings.SESSION_COOKIE_NAME en request.POST en URL específicas y vuelca en request.COOKIES funciona muy bien para esto :)

  2. Además, recuerde que debe devolver algo en el cuerpo de la respuesta para que SWFUpload lo reconozca como un intento exitoso de carga. Creo que esto ha cambiado en la última versión beta de SWFUpload, pero de todos modos es aconsejable poner algo allí como 'ok'. Para los fracasos, haga uso de algo como HttpResponseBadRequest o similar.

  3. Por último, en caso de que usted está teniendo problemas para encontrar ellos, el archivo subido es en request.FILES :)

Si tienes algo desconcertante que no he cubierto, no dude en enviar algo más detallada y estaré encantado de ayudar.

+4

Esta es una excelente respuesta a una pregunta realmente terrible. El segundo párrafo del punto (1) me ayudó en particular. Gracias. – bouvard

0

La siguiente es la implementación específica de Django para solucionar este problema (es decir, mis cargas fallaron en Firefox con un 302 Redirect).

En mi opinión inicial que genera la página con el programa para subir en él, miré a las galletas y encontró sessionid

ipdb> self.request.COOKIES 
{'csrftoken': '43535f552b7c94563ada784f4d469acf', 'sessionid': 'rii380947wteuevuus0i5nbvpc6qq7i1'} 

Cuando vi lo que estaba siendo publicado en el SWFUploadMiddleware (cuando se utiliza Firefox), Descubrí que el sessionid no se estaba configurando.

En mi vista inicial que genera la página que contiene el controlador de carga, agregué el sessionid al contexto.

context['sessionid'] = self.request.session.session_key 

En mi configuración swfuploader, añadí sessionid a la opción post-params de la siguiente manera:

post_params: {... "sessionid": "{{ sessionid }}" ...}, 

Ahora, cuando miraba en el SWFUploadMiddleware, pude ver la sessionid siendo publicado, y mis cargas comenzaron a funcionar si Firefox.

ipdb> request.POST 
<QueryDict: {... u'session_id': [u'rii380947wteuevuus0i5nbvpc6qq7i1'],...}> 

Para completar, mi SWFUploadMiddleware se parece a esto ...

from django.conf import settings 
from django.core.urlresolvers import reverse 

class SWFUploadMiddleware(object): 
    def process_request(self, request): 
     if (request.method == 'POST') and (request.path == reverse('upload_handler')) and request.POST.has_key(settings.SESSION_COOKIE_NAME): 
      request.COOKIES[settings.SESSION_COOKIE_NAME] = request.POST[settings.SESSION_COOKIE_NAME] 
    # http://stackoverflow.com/questions/6634666/403-forbidden-error-on-swfupload-and-django 
    # Fix for problem uploading images (403 error) in Firefox 20 and others 
    if request.POST.has_key('csrftoken'): 
      request.COOKIES['csrftoken'] = request.POST['csrftoken'] 
Cuestiones relacionadas