2013-10-26 61 views
0

我有一个通过AJAX提交并上传文件的表单。但是,虽然文件已正确上传,但JavaScript在上传后显示INTERNAL SERVER ERROR。我知道该文件被添加到数据库并上传到服务器;除了这个错误信息,一切似乎都按预期工作。 Django日志中似乎没有错误消息。Django内部服务器错误与json

我也没有编写处理javascript的代码,所以实际上可能有更好的方法来做这件事或者我忽略了一些明显的东西。

看来,错误发生,因为这行:

response = JSONResponse(data, {}, response_mimetype(self.request)) 

在我views.py:

def response_mimetype(request): 
    if "application/json" in request.META['HTTP_ACCEPT']: 
     return "application/json" 
    else: 
     return "text/plain" 

class UploadedFileCreateView(CreateView): 
    model = UploadedFile 
    form_class = UploadedFileForm 

    def form_valid(self, form): 
     self.object = form.save(commit=False) 
     self.object.project_id = self.kwargs['proj_key'] 
     self.object.save() 
     f = self.request.FILES.get('file') 

     data = [{ 
      'name': self.object.name(), 
      'url': "/uploads/xmlfiles/" + self.object.name().replace(" ", "_"), 
      'delete_url': reverse('fileupload:upload-delete', 
       kwargs={'pk':self.object.id, 
       'proj_key':self.kwargs['proj_key']}), 
      'delete_type': "DELETE"}] 


     # the problem line 
     response = JSONResponse(data, {}, response_mimetype(self.request)) 
     response['Content-Disposition'] = 'inline; filename=files.json' 
     return super(UploadedFileCreateView, self).form_valid(form) 

    def get_context_data(self, **kwargs): 
     context = super(UploadedFileCreateView, self).get_context_data(**kwargs) 
     context['files'] = UploadedFile.objects.all() 
     context['proj'] = int(self.kwargs["proj_key"]) 
     return context 

class JSONResponse(HttpResponse): 
    """JSON response class.""" 
    def __init__(self,obj='',json_opts={},mimetype="application/json",*args,**kwargs): 
     content = simplejson.dumps(obj,**json_opts) 
     super(JSONResponse,self).__init__(content,mimetype,*args,**kwargs) 

我想这个问题可能是reverse的方法,但一切正常那里。为以防万一,这里是从urls.py行:

(r'^projects/(?P<proj_key>\d+)/d/(?P<pk>\d+)$', UploadedFileDeleteView.as_view(), {}, 'upload-delete'), 

及相关模型:

class UploadedFile(models.Model): 
    """This represents a file that has been uploaded to the server.""" 
    STATE_UPLOADED = 0 
    STATE_ANNOTATED = 1 
    STATE_PROCESSING = 2 
    STATE_PROCESSED = 4 
    STATES = (
     (STATE_UPLOADED, "Uploaded"), 
     (STATE_ANNOTATED, "Annotated"), 
     (STATE_PROCESSING, "Processing"), 
     (STATE_PROCESSED, "Processed"), 
    ) 

    status = models.SmallIntegerField(choices=STATES, 
     default=0, blank=True, null=True) 
    file = models.FileField(upload_to=settings.XML_ROOT) 
    project = models.ForeignKey(Project) 

    def __unicode__(self): 
     return self.file.name 

    def name(self): 
     return os.path.basename(self.file.name) 

    def save(self, *args, **kwargs): 
     if not self.status: 
      self.status = self.STATE_UPLOADED 
     super(UploadedFile, self).save(*args, **kwargs) 

    def delete(self, *args, **kwargs): 
     os.remove(self.file.path) 
     self.file.delete(False) 
     super(UploadedFile, self).delete(*args, **kwargs) 

编辑:刚才注意到在控制台此500错误,但我不知道在哪里可以找到一个堆栈跟踪(因为我没有看到一个错误模板):

[29/Oct/2013 23:38:56] "POST /upload/projects/1/ HTTP/1.1" 500 11939 
+0

如果500,你应该看到的地方一个堆栈跟踪,你可以发布它吗? –

+0

我没有收到500错误,至少我看不到(日志文件,控制台)。 – Plasma

回答

0

您需要的之前移动JSONResponse类的定义class;在尚未定义的类中调用该类之前,会发生错误。

的对象被保存,因为你已经保存它调用JSONReponse课前:

def form_valid(self, form): 
    self.object = form.save(commit=False) 
    self.object.project_id = self.kwargs['proj_key'] 
    self.object.save() # object gets saved successfully here 
    f = self.request.FILES.get('file') 

    # ... 


    # Here, JSONResponse is not defined yet, so this is resulting in a 500 
    # since you have debug=False, its resulting in the default 500 error template 
    # from your server. 
    response = JSONResponse(data, {}, response_mimetype(self.request)) 
+0

不,这不是问题 - 我仍然有同样的问题。为什么大家都认为这是一个500错误?我没有看到任何具体的错误消息,我也不知道我怎么看到一个('内部服务器错误'是javascript的输出,而不是django)。 还值得注意的是,该文件实际上传到服务器。 – Plasma

+0

其实,你是对的 - 有500错误,但我不知道如何看到堆栈跟踪,因为我没有看到它的模板。我将控制台日志行添加到我的OP。 – Plasma