使用Uploadify获取HTTP响应代码403,在Django中上传文件

时间:2012-01-12 11:47:54

标签: jquery django uploadify django-uploads

我正在尝试使用this tutorial之后的Uploadify上传Django中的文件。我已经正确地执行了所有步骤。除此之外,我还制作了一个模型,用于存储有关正在上传的文件的信息。

我的模板包含此

<script type="text/javascript" src="{{ STATIC_URL }}uploadify/swfobject.js"></script>
<script type="text/javascript" src="{{ STATIC_URL }}uploadify/jquery.uploadify.v2.1.4.js"></script>
<script type="text/javascript">
    $(document).ready(function() {
        $('#file_upload').uploadify({
            'uploader'  : '{{ STATIC_URL }}uploadify/uploadify.swf',
            'script'    : '{% url upload_file %}',
            'cancelImg' : '{{ STATIC_URL }}uploadify/cancel.png',
            'auto'      : true,
            'multi'     : true,
            'fileExt'   : '*.doc;*.docx;*.pdf',
            'fileDesc'  : 'Upload Docs',
            'queueID'   : 'file_upload_queue',
            'removeCompleted': false,
        });
    });
</script>

<h2 id="smallHeading"> Upload your Documents </h2>
<input id="file_upload" type="file" name="Filedata" />
<a href="javascript:$('#file_upload').uploadifyUpload();">Upload Files</a>

我的url.py文件包含此行

  url(r'^upload/$', 'userprofile.views.upload_file', name='upload_file'), 

并且视图是

@csrf_exempt
def upload_file(request):
    if request.method == "POST":
        upload_file = request.FILES['Filedata']
        upload_instance = Uploads.objects.create(creator = request.user, uploaded_on = datetime.datetime.now())
    upload_instance.file.save(upload_file.name,upload_file)
    upload_instance.save()

    response = HttpResponse()
    response.write("%s\r\n" % upload.name)
    return response

我的models.py包含

def get_file_path(instance, filename):
    return os.path.join('userprofiles', str(instance.creator.id), filename)

class Uploads(models.Model):
    file = models.FileField(upload_to=get_file_path)
    creator = models.ForeignKey(User)
    uploaded_on = models.DateTimeField()

但这里什么也没发生。我得到的只是上传按钮,我选择文件但没有任何反应。任何人都可以帮我找出发生的事情吗?似乎script没有被解雇。我知道这是因为之前我的观点中有错误,但没有出现错误。

非常感谢任何帮助。

修改

我在firebug控制台中没有看到任何内容,net面板也没有显示任何POST请求,但django debugger显示了文件上传的POST请求有403回复。我使用了csrf_exempt,为什么它应该是forbidden

解决方案:我终于解决了这个问题。关于403错误,我从link找到了一些有趣的东西。如果视图包含装饰器csrf_exempt,并且该视图存在404错误,则django会显示403错误。

实际问题是我的链接最初是错误的,所以当我更正它时,我停止了403错误,但我开始得到500错误。这意味着视图中出现了问题。由于uploadufy没有在firebug中记录任何内容,因此我不得不在我的视图中逐步调试。

似乎uploadify脚本发送的请求对象未完成,创建对象时的行creator = request.user给出了错误。除此行外,上面发布的代码完全有效。

1 个答案:

答案 0 :(得分:1)

我建议进一步调试,以查看问题是在客户端JavaScripts还是服务器端Django代码中。

下载适用于Firefox的Firebug插件。加载您的页面。打开Firebug并转到“Net”选项卡。确保加载了所有JavaScripts。 接下来,检查控制台以查看是否存在任何JavaScript错误。 接下来检查Django日志以查看是否有任何HTTP请求通过,并且可能在它们中有错误。

这可以帮助您获取更多信息,这有助于您解决问题。您可以随时使用从上述步骤中收集的其他信息更新您的问题。