文件上传错误&即使{%csrf_token%},方法发布时出现csrf错误

时间:2014-02-07 10:11:51

标签: python django django-csrf django-file-upload

好的,我知道我的问题有很多,但我找不到解决问题的答案。我是Django的新手,所以请记住。

我需要做一个上传文件:

这是我的upload.py(这是一个views.py)

from django.http import HttpResponse
def upload(request)
  viewfile = HttpResponse()
  viewfile.write('''
             <html>
             <body>
             <form action="/upload_done/" method="POST" enctype="multipart/form-data" {% csrf_token %}>
                 <label for="file">Filename:</label>
                 <input type="file" name="up_file" >
                  <br />
                  <input type="submit" name="submit" value="Submit" >
             </form>
    return HttpResponse(viewfile)

现在我的upload_done.py:

from django.http import HttpResponseRedirect
from django.template import RequestContext
from django.shortcuts import render_to_response
from django.http import HttpResponse
import tempfile
import shutil
def upload_done(request):
  viewfile = HttpResponse()
  #####First I Tried this
  Up_file = request.FILES['up_file']
   """ It gives multivalue error('' 'up_file' '')
  # then I change my upload.py input type file to text & try to collect information
  # and change here Up_file = request.FILES['up_file'] to this
   Up_file = request.POST['up_file']

现在我收到403 csrf错误 从Django doc,Iam无法理解模板(只能理解file.html应该与views.py的功能名称相同)是如何工作的。

请帮助我如何使用post方法&amp;如何上传文件。谢谢提前...

我也尝试了这样(写在/home/user/myproject/template/upload_form.html)(注意:模板dirctory正常工作)

<html>
             <body>
             <form action="/upload_done/" method="POST" enctype="multipart/form-data" {% csrf_token %}>
                 <label for="file">Filename:</label>
                 <input type="file" name="up_file" >
                  <br />
                  <input type="submit" name="submit" value="Submit" >
             </form>

&安培;在上面的第二个Views.py(即upload_form.py)中将'up_file = request.FILES ['up_file']'替换为此

if request.method == 'POST':
    return render(request, 'upload_form.html',{})

但是得到错误(必须返回HttpResponse)

2 个答案:

答案 0 :(得分:2)

您无法直接在视图中编写HTML,并希望将其自动视为模板。虽然您可以将该字符串传递给模板渲染系统,但仍有充分的理由将模板和视图分开。

请返回并再次查看显示如何呈现模板的所有示例,并执行此操作而不是对HTML进行硬编码。本教程非常好,并向您展示了如何执行此操作,因此没有必要说“我无法理解模板的工作原理”。

此外,您不应为每个视图编写单独的Python文件。您可以在每个文件中具有多个视图功能。当您完成模板学习后,您可以去阅读有关表单的文档。

答案 1 :(得分:2)

这应该是这样的:

upload_form.html:

<form method="POST" enctype="multipart/form-data" >
{% csrf_token %}
    {{ form.as_p }}
    <input type="submit" name="submit" value="Submit" >
</form>

查看(基于the docs的示例):

from django import forms
class UploadFileForm(forms.Form):
    up_file = forms.FileField()

def handle_uploaded_file(f):
    with open('some/file/name.xls', 'wb+') as destination:
        for chunk in f.chunks():
            destination.write(chunk)

from django.http import HttpResponseRedirect
from django.shortcuts import render
def upload(request):
    if request.method == "POST":
        form = UploadFileForm(request.POST, request.FILES)
        if form.is_valid():
            handle_uploaded_file(request.FILES['up_file'])
            return HttpResponseRedirect('/upload_done/')

    form = UploadFileForm()
    return render(request, 'upload_form.html', {'form': form})

这只是一个骨架。没有数据处理,没有错误处理,重定向后的视图没有任何内容。即使您处于最后期限压力之下,如果没有对框架的一些最小理解,您将无法操纵此示例。所以花点时间到go over the tutorial。我无法伸展这个。它不长,而且非常详细。

修改

我使用django表单将示例更新为完整的文件处理示例。我发现使用表单进行处理然后使用函数保存文件很奇怪,但是看到这就是文档的工作方式,我不会采取其他方式