在利用flask 框架开发blog系统时,需要提供用户上传头像的功能,我们查看 flask wtf 文档 发现可以利用flask wtf 表单控件来实现文件上传。于是我们首先实现了如下的更新用户资料的表单代码:

class EditProfileForm(Form):name = StringField('Real name',validators=[Length(0,64)])location = StringField('Location',validators=[Length(0,64)])about_me = TextAreaField('About me')image = FileField('Your Photo')submit = SubmitField('submit')

其中image属性是一个FileFiled控件,用来接收用户上传的头像图片。
然后还需要在view部分实现相应的路由,代码如下:

#view 部分实现的更新资料路由
@main.route('/edit-profile',methods=['GET','POST'])
@login_required
def edit_profile():form = EditProfileForm()if form.validate_on_submit():current_user.name = form.name.datacurrent_user.location = form.location.datacurrent_user.about_me = form.about_me.datafilename = secure_filename(form.image.data.filename)form.image.data.save(./uploads/ + filename)current_user.image = './uploads/' + filenamedb.session.add(current_user)#db.session.rollback()flash('Your Profile has been updated')return redirect(url_for('.user',username=current_user.username))form.name.data = current_user.nameform.location.data = current_user.locationform.about_me.data = current_user.about_mereturn render_template('edit_profile.html',form=form)

代码看似没有问题,于是我们开始执行一下,然后发现了如下的错误:
IOError: [Errno 21] Is a directory: ‘./uploads/’
在百度中搜索,发现在stackoverflow上有相关的解决方案、
原来是在form.image.data.save 这个方法中需要提供绝对的路径,不能提供像./uploads/ 这种相对的路径。于是我们修改代码如下:

import os
from werkzeug import secure_filename
APP_ROOT = os.path.dirname(os.path.abspath(__file__))
UPLOAD_FOLDER = os.path.join(APP_ROOT, './uploads')
@main.route('/edit-profile',methods=['GET','POST'])
@login_required
def edit_profile():............form.image.data.save(UPLOAD_FOLDER + filename)current_user.image = APP_ROOT +'/uploads/' + filename....................

我们利用 os.path.dirnameos.path.join 来得到绝对的路径名称,然后提供给form.image.data.save 方法使用。
这样再执行代码,发现前面的IOError: [Errno 21] Is a directory: './uploads/' 错误不见了,顿时心里很开心。但是问题又来了,在我们测试的时候,图片并没有上传到我们制定的uploads文件夹,而且图片的名字的前缀是uploads。直觉告诉我们这肯定是把路径的名字写到文件名中了。于是我们继续查看保存图片的代码,然后发现了一处细微的错误:

UPLOAD_FOLDER = os.path.join(APP_ROOT, './uploads')
此处应该写成UPLOAD_FOLDER = os.path.join(APP_ROOT, './uploads/')

然后我们再测试代码,发现已经可以正常工作了。

Flask IOError相关推荐

  1. python flask源码解析_用尽洪荒之力学习Flask源码

    [TOC] 一直想做源码阅读这件事,总感觉难度太高时间太少,可望不可见.最近正好时间充裕,决定试试做一下,并记录一下学习心得. 首先说明一下,本文研究的Flask版本是0.12. 首先做个小示例,在p ...

  2. Python中使用Flask、MongoDB搭建简易图片服务器

    转自:http://www.ctolib.com/topics-43840.html 1.前期准备 通过 pip 或 easy_install 安装了 pymongo 之后, 就能通过 Python ...

  3. Flask 第三方组件之 login

    在了解使用Flask来实现用户认证之前,我们首先要明白用户认证的原理.假设现在我们自己去实现用户认证,需要做哪些事情呢? 首先,登录.用户能够输入用户名和密码进行登录,所以需要网页和表单,实现用户输入 ...

  4. flask导出Excel报表详解

    在日常开发中,导出数据报表可谓必备技能,在后台管理中,很多模块都需要数据报表,现在我们一起来学习一下 flask 如何导出数据报表. 没有实例的讲解很不容易理解,本文我们依然从实际项目来讲解,对 &q ...

  5. 江在川上曰:云服务器上的flask项目部署(Ubuntu+Flask+Gunicorn+Supervisor+Nginx+Anaconda)

    云服务器上的flask项目部署(anaconda.python.flask等相关安装) 在探索未知的路上走了很多弯路,这里记载了我在阿里云上部署项目切实可行的步骤,当然问题因人而异,没有四海皆适用的准 ...

  6. 使用Flask实现用户登陆认证的详细过程

    用户认证的原理 在了解使用Flask来实现用户认证之前,我们首先要明白用户认证的原理.假设现在我们要自己去实现用户认证,需要做哪些事情呢? 首先,用户要能够输入用户名和密码,所以需要网页和表单,用以实 ...

  7. flask 学习实战项目实例

    ScrapydWeb:用于 Scrapyd 集群管理的 web 应用 Tcloud云测平台后端服务 (flask 前后端分离) SpiderKeeper:A scalable admin ui for ...

  8. Flask学习之路(一)--初识flask

    0.Flask简介 Flask是python三大框架之一, Flask流行的原因,可以分为以下几点: 微框架,简洁,只做他需要做的,给开发者提供了很大的扩展性 Flask和相应的插件写得很好,用起来很 ...

  9. 通过带Flask的REST API在Python中部署PyTorch

    通过带Flask的REST API在Python中部署PyTorch 在本文中,将使用Flask来部署PyTorch模型,并用讲解用于模型推断的 REST API.特别是,将部署一个预训练的Dense ...

最新文章

  1. linux -- control service and daemon process
  2. 《幸福就在你身边》第一课、你有追求美好生活的权利【哈佛大学幸福课精华】...
  3. 疯狂连连看之开发游戏界面组件一
  4. python transform(img)_pytorch之ImageFolder使用详解
  5. mysql函数第一次返回字符串_Mysql字符串处理函数详细介绍、总结
  6. for循环,while循环,break跳出循环,continue结束本次循环,exit退出整个脚本
  7. 第七章 软件配置管理
  8. 快捷键调出计算机桌面小工具,win7桌面怎么快速创建便签小工具
  9. Discuz!开发之HTML转Discuz代码(bbcode)函数html2bbcode()
  10. 论文3 VScodetexliveSumatraPDF打造完美书写论文工具
  11. qqxml图片代码_QQXML代码大全(持续更新)
  12. Foxmail中的文件夹丢失解决方法
  13. 粒子滤波与重要性采样
  14. 解决网络波动数据传输问题——spring的重试机制@Retryable
  15. android 播放一段音效,android 之使用SoundPool播放音效(Duang~)
  16. 以前给客户开发了一个本地同城小程序
  17. python画卡通人物_追忆童年,教你用Python画出儿时卡通人物
  18. JavaSE_day02【类型转换、进制、运算符】
  19. html第一个子元素选择,css选中父元素下的第一个子元素(:first-child)
  20. ResourceAccessException: I/O error on POST request for “http://localhost:9411/api/v2/spans“

热门文章

  1. 用C语言读取png图片十六进制,C/C++ 二进制读写 png 文件
  2. vue---发表评论页面编写
  3. HDUOJ 2042不容易系列之二
  4. 突破无线路由器关闭广播SSID
  5. SLAM--ORB特征点提取--啰里啰嗦的代码解析
  6. [Android]拉代码、上库、编译等
  7. 怎样破解项目中的“死亡螺旋”困境
  8. 【读过的书】《小王子》
  9. 前端数组删除元素字典操作
  10. 泛微第三方异构系统调用流程