Windows 7
IIS 7.5
Helicon Zoo 3.1.98.508
Django 1.6.3
Python 2.7.3
我应该声明我是Django和Helicon Zoo的新手。
发生的事情是,虽然我似乎没有在默认值为2.5mb的情况下上传文件时出现问题,但我无法正确上传任何超过此金额的内容。虽然我确定我可以在我的设置文件中达到此限制,但我真的不愿意为了我的目的,我可以看到需要上传比我真正希望由内存处理的更大的文件。
我在尝试此操作时看到的是一个来自Helicon Zoo的关于一些丢失标题的错误信息
Worker Status
The process was created
Windows error
The operation completed successfully. (ERROR CODE: 0)
Internal module error
message: HTTP-headers - are expected
type: ZooException
file: Jobs\JobFastCgi.cpp
line: 391
version: 3.1.98.508
STDERR
Empty stderr
起初,我想也许这与temp文件夹有关,所以我设置了
FILE_UPLOAD_TEMP_DIR = [os.path.join(BASE_DIR, 'temp')]
在我的设置文件中,但它似乎没有做任何有用的事情。
然后我发现了如何启用django的日志记录,这对我来说真的很开放。我现在知道错误来自哪里......但我不知道我应该做些什么来绕过它......
[29/Apr/2014 11:37:00] ERROR [django.request:226] Internal Server Error: /upload/
Traceback (most recent call last):
File "E:\mysite\venv\lib\site-packages\django\core\handlers\base.py", line 107, in get_response
response = middleware_method(request, callback, callback_args, callback_kwargs)
File "E:\mysite\venv\lib\site-packages\django\middleware\csrf.py", line 170, in process_view
request_csrf_token = request.POST.get('csrfmiddlewaretoken', '')
File "E:\mysite\venv\lib\site-packages\django\core\handlers\wsgi.py", line 146, in _get_post
self._load_post_and_files()
File "E:\mysite\venv\lib\site-packages\django\http\request.py", line 215, in _load_post_and_files
self._post, self._files = self.parse_file_upload(self.META, data)
File "E:\mysite\venv\lib\site-packages\django\http\request.py", line 180, in parse_file_upload
return parser.parse()
File "E:\mysite\venv\lib\site-packages\django\http\multipartparser.py", line 197, in parse
charset)
File "E:\mysite\venv\lib\site-packages\django\core\files\uploadhandler.py", line 135, in new_file
self.file = TemporaryUploadedFile(self.file_name, self.content_type, 0, self.charset)
File "E:\mysite\venv\lib\site-packages\django\core\files\uploadedfile.py", line 61, in __init__
dir=settings.FILE_UPLOAD_TEMP_DIR)
File "E:\mysite\venv\lib\site-packages\django\core\files\temp.py", line 27, in __init__
dir=dir)
File "C:\python27\lib\tempfile.py", line 300, in mkstemp
return _mkstemp_inner(dir, prefix, suffix, flags)
File "C:\python27\lib\tempfile.py", line 235, in _mkstemp_inner
fd = _os.open(file, flags, 0600)
TypeError: coercing to Unicode: need string or buffer, list found
这是什么意思?我的块是否以某种方式作为列表对象进入并且我没有意识到它?
这是我的应用代码,它包含在我制作的博客应用中,因为它是我的主应用程序,它似乎比创建自己的应用程序更简单。这是一个错误吗?
forms.py
from django import forms
class UploadFileForm(forms.Form):
title = forms.CharField(max_length=50)
file = forms.FileField()
views.py
from django.shortcuts import render, render_to_response
from django.http import HttpResponse, Http404, HttpResponseRedirect
from django.template import RequestContext, loader
from blog.forms import UploadFileForm
from blog.models import Blog
from blog.uploads import handle_uploaded_file
def index(request):
latest_blog_list = Blog.objects.order_by('-pub_date')[:5]
template = loader.get_template('blog/index.html')
context = RequestContext(request, {
'latest_blog_list': latest_blog_list,
})
return HttpResponse(template.render(context))
def detail(request, blog_id):
try:
blog = Blog.objects.get(pk=blog_id)
except:
raise Http404
return render(request, 'blog/detail.html', {'blog': blog})
def upload_file(request):
if request.method == 'POST':
form = UploadFileForm(request.POST, request.FILES)
if form.is_valid():
handle_uploaded_file(request.FILES['file'])
#form.save()
return HttpResponseRedirect('/upload/')
else:
form = UploadFileForm()
return render_to_response('upload/upload.html', {'form': form}, context_instance=RequestContext(request))
uploads.py
import os
saveDir = 'E:\\uploads\\'
def handle_uploaded_file(f):
#logging.debug('upload_here')
if f:
destination = open(saveDir + f.name, 'wb+')
for chunk in f.chunks():
destination.write(chunk)
destination.close()
app urls.py
from django.conf.urls import patterns, url
from blog import views
urlpatterns = patterns('',
url(r'^$', views.index, name='index'),
url(r'^(?P<blog_id>\d+)/$', views.detail, name='detail'),
url(r'^upload/$', views.upload_file, name='upload'),
)
项目urls.py
from django.conf.urls import patterns, include, url
from django.conf import settings
from django.conf.urls.static import static
from django.contrib import admin
admin.autodiscover()
urlpatterns = patterns('',
# Examples:
# url(r'^$', 'project.views.home', name='home'),
# url(r'^blog/', include('blog.urls')),
url(r'^/?', include('blog.urls', namespace="blog")),
url(r'^admin/', include(admin.site.urls)),
url(r'^upload/', include('blog.urls', namespace="upload")),
)
我还应该注意,这些大文件的部分实际上出现在我的上传位置,但大小不超过1兆。这个过程在它出于某种原因实际完成之前停止了。然后我必须停止并重新启动IIS以使网站再次运行。
答案 0 :(得分:0)
所以这里有几个不同的问题。首先,我发现了
TypeError: coercing to Unicode: need string or buffer, list found
错误不是因为我的代码发送了对象,而是因为设置
FILE_UPLOAD_TEMP_DIR = [os.path.join(BASE_DIR, 'temp')]
需要改为
FILE_UPLOAD_TEMP_DIR = os.path.join(BASE_DIR, 'temp')
这是当它不应该被发送为列表时,在尝试复制django项目设置文件中的其他字段时的简单错误。我应该注意到DIRS和DIR之间的区别,当然这表示一个单一的参考。
其次,在解决该问题后,错误仍在继续。经过几天的努力,试图找到一个可能会将我的上传内容缩小到1MB的IIS设置,或者可能是我忽略的django设置,甚至测试一个预建的应用程序,只是仍然打到同一个砖墙,在阅读Helicon Zoo错误报告的配置变量列表时,我终于明白了,我注意到了......
postBuffer = 1024
...的儿子......经过一番研究后,我发现我可以通过在Helicon Zoo web.config中使用环境变量来修改此设置。
POST_BUFFER = "4096"
Viola ..我可以突然上传超过1mb的任何东西......超过4mb的东西被截断,我收到错误!
所以我终于找到了这个问题,但对我来说完全出乎意料的是,我找不到任何关于此问题的文档作为一个问题。当然,我不是唯一一个遇到此问题的人,因为这是默认设置!我希望我可以完全删除它,因为即使是一个限制,因为django处理这个很好,我真的不需要Helicon为我做这件事。不幸的是,如果我将值设置为0,那么根本不会有任何上传工作。所以现在我要将这个值设置为任意高的值,因为坦率地说它不是必需的,并且不会以任何方式帮助我。
更新:感谢rukeba上面的评论,他的解决方案是这个问题的最终答案,因为Twisted引擎没有这个问题。