Flask头像上传遇TypeError:函数未返回值,求技术支持
Flask头像上传报错TypeError:函数返回None的排查与解决
核心错误:upload_image函数缺少GET请求分支的返回语句
你的视图函数只在POST请求的try/except块里写了return,但当用户以GET方式访问/upload_image(比如直接跳转页面)时,代码会走到函数末尾,没有任何返回值,这就触发了Flask的TypeError。
修复方法:在函数最后添加GET请求的返回逻辑:
@view.route('/upload_image', methods=['GET','POST']) def upload_image(): form = upload_form() id = current_user.id name_to_update = Users.query.get_or_404(id) if request.method =='POST': name_to_update.image = request.files['image'] Pic_filename = secure_filename(name_to_update.image.filename) pic_name = str(uuid.uuid1()) + '_' + Pic_filename saver = request.files['image'] name_to_update.image = pic_name try: db.session.commit() # 修正配置键名的空格问题 saver.save(os.path.join(app.config['UPLOAD_FOLDER'], pic_name)) flash('user profile updated successfully') return render_template('account.html', form=form, name_to_update=name_to_update) except: flash('something is not working') return render_template('account.html', form=form, name_to_update=name_to_update) # 新增:GET请求时返回页面 return render_template('account.html', form=form, name_to_update=name_to_update)
其他关键问题修复
表单文件字段名称不匹配
前端input的name是filename,但后端用request.files['image']获取,两者不一致导致拿不到上传文件。把前端input的name改成image:<input type="file" name="image" id="imgInp" >配置键名拼写错误
代码里写的app.config['UPLOAD FOLDER']多了空格,正确的应该是app.config['UPLOAD_FOLDER'],和你之前配置的键名一致,否则会找不到上传目录。文件上传表单必须加
enctype属性
上传文件的form标签必须添加enctype="multipart/form-data",否则后端无法解析文件数据;另外如果用了Flask-WTF,还要加CSRF保护的隐藏字段,同时修正form标签的methods为单数method:<form method='POST' action="{{ url_for('view.upload_image') }}" class="dropzone" enctype="multipart/form-data"> {{ form.hidden_tag() }} <div class="profileupload"> <input type="file" name="image" id="imgInp" > <a href="" class="text-white"><i class="fa fa-edit"></i></a> <button type="submit" class="btn btn-primary">upload</button> </div> </form>头像展示逻辑修复
当前前端固定显示apple.png,需要改成动态展示用户上传的头像,处理用户未上传的情况:<div> {% if name_to_update.image %} <img src="{{ url_for('static', filename='uploads/' + name_to_update.image) }}" alt="用户头像" id="blah"> {% else %} <img src="static/img/apple.png" alt="默认头像" id="blah"> {% endif %} </div>
额外建议
- 捕获异常时尽量指定具体异常类型(比如
except Exception as e:),不要用裸except,方便排查具体错误; - 可以先打印
request.files查看是否获取到文件,确认上传流程是否正常; - 确保
static/uploads/目录存在,否则保存文件会报错,可在代码里添加目录创建逻辑:import os if not os.path.exists(app.config['UPLOAD_FOLDER']): os.makedirs(app.config['UPLOAD_FOLDER'])
内容的提问来源于stack exchange,提问作者Rak
相关产品推荐
相关产品推荐

