Skip to main content
 首页 » 编程设计

python之当 html 表单允许文件上传时,Django 以 "generator raised StopIteration"停止

2025年05月04日27powertoolsteam

我的设置是 Windows 10、Python 3.7、Apache 2.4/mod_wsgi。当我在我的表单中添加此 enctype="multipart/form-data" 时(仅通过添加此属性 - 没有文件附加到表单)我在提交时收到此错误:

Django Version: 1.8.5 
Exception Type: RuntimeError 
Exception Value: generator raised StopIteration 
Exception Location: c:\users\holistic\envs\vitadmin\lib\site-packages\django\http\multipartparser.py in read, line 337 
Python Executable: C:\Apache24\bin\httpd.exe 
Python Version: 3.7.3 

我的 Django 代码是这样的:

elif request.method == "POST": 
    rid = request.POST.get("recipe", "") 
    title = request.POST.get("title") 
    content = request.POST.get("content") 
    tag_names = request.POST.getlist("tags") 
    image = request.FILES.get("image") 
    if rid: 
        recipe = get_object_or_404(FoodRecipe, pk=rid) 
    else: 
        recipe = FoodRecipe.objects.create(title=title) 
    recipe.content = content 
    recipe.title = title 
    if image: 
        recipe.featured = image 
    for tn in tag_names: 
        tag, cr = Tag.objects.get_or_create( 
            name=tn 
        ) 
        recipe.tags.add(tag) 
    recipe.save() 

这是完整的回溯:

Environment: 
Request Method: POST 
Request URL: http://192.168.1.250/recipes/add/ 
Django Version: 1.8.5 
Python Version: 3.7.3 
Installed Applications: 
('django.contrib.admin', 
 'django.contrib.auth', 
 'django.contrib.contenttypes', 
 'django.contrib.sessions', 
 'django.contrib.messages', 
 'django.contrib.staticfiles', 
 'tinymce', 
 'sekizai', 
 'sorl.thumbnail', 
 'recipes', 
 'guides', 
 'inbox', 
 'appdata', 
 'account', 
 'customer', 
 'core') 
Installed Middleware: 
('django.contrib.sessions.middleware.SessionMiddleware', 
 'django.middleware.common.CommonMiddleware', 
 'django.middleware.csrf.CsrfViewMiddleware', 
 'django.contrib.auth.middleware.AuthenticationMiddleware', 
 'django.contrib.auth.middleware.SessionAuthenticationMiddleware', 
 'django.contrib.messages.middleware.MessageMiddleware', 
 'django.middleware.clickjacking.XFrameOptionsMiddleware', 
 'django.middleware.security.SecurityMiddleware', 
 'account.middleware.PasswordChangeMiddleware.PasswordChangeMiddleware') 
 
 
Traceback: 
File "c:\users\holistic\envs\vitadmin\lib\site-packages\django\core\handlers\base.py" in get_response 
  125.                     response = middleware_method(request, callback, callback_args, callback_kwargs) 
File "c:\users\holistic\envs\vitadmin\lib\site-packages\django\middleware\csrf.py" in process_view 
  174.                     request_csrf_token = request.POST.get('csrfmiddlewaretoken', '') 
File "c:\users\holistic\envs\vitadmin\lib\site-packages\django\core\handlers\wsgi.py" in _get_post 
  137.             self._load_post_and_files() 
File "c:\users\holistic\envs\vitadmin\lib\site-packages\django\http\request.py" in _load_post_and_files 
  260.                 self._post, self._files = self.parse_file_upload(self.META, data) 
File "c:\users\holistic\envs\vitadmin\lib\site-packages\django\http\request.py" in parse_file_upload 
  225.         return parser.parse() 
File "c:\users\holistic\envs\vitadmin\lib\site-packages\django\http\multipartparser.py" in parse 
  149.             for item_type, meta_data, field_stream in Parser(stream, self._boundary): 
File "c:\users\holistic\envs\vitadmin\lib\site-packages\django\http\multipartparser.py" in __iter__ 
  628.             yield parse_boundary_stream(sub_stream, 1024) 
File "c:\users\holistic\envs\vitadmin\lib\site-packages\django\http\multipartparser.py" in parse_boundary_stream 
  567.     chunk = stream.read(max_header_size) 
File "c:\users\holistic\envs\vitadmin\lib\site-packages\django\http\multipartparser.py" in read 
  337.         out = b''.join(parts()) 
 
Exception Type: RuntimeError at /recipes/add/ 
Exception Value: generator raised StopIteration 

任何想法出了什么问题?

PS:相同的 django 应用程序在 Linux/Nginx/Gunicorn/Python2.7 设置中运行良好。所以,我想这一定是 Django/Python/Apache 之间的一些错误配置。

请您参考如下方法:

您的 Django 很旧,您需要更新。这是 Django 开发人员已经解决的 Python 3.7 兼容性问题 fixed四年前,当时它只是 Python 3.5 上的 PendingDeprecationWarning。

事实上,您使用的是最后一个没有修复的 Django 版本。即使是 1.8.6 也有修复。