Flask 上传自定义头像的实例详解


Posted in Python onJanuary 09, 2020

Flask Web 开发这本书基本上做完了,后面还需要温习,但是自己做的博客总觉得简陋了点,所以,在动脑子开发新功能

今天想到最基本的功能,自定义头像

那这样的功能,设计到2大基本功能块

1:如何进行文件的上传和保存

2:如何在用户模型里面将头像照片和用户挂钩起来

第二个问题我在查阅了网上的讨论后,得出基本上2种方法,

第一种是将图片变成二进制以后存入数据库

第二种是将图片直接存放于文件系统中

先研究如何上传文件成功这个事情

从最简单的开始

在main的views文件内,添加以下准备工作

import os
from flask import Flask, request, redirect, url_for
 
UPLOAD_FOLDER=r'E:\flasky\app\upload'

设置UPLOAD_FOLDER的路径,表示文件最终要存在哪一个位置

@main.route('/upload_file',methods = ['GET','POST'])
def upload_file():
 
#...
 if request.method == 'POST':
 file = request.files['file']
 file.save(os.path.join(UPLOAD_FOLDER,file.filename))
 return '<p>success</p>'
 return '''
 <!DOCTYPE html>
 <title>Change new icon</title>
 <h1>Upload new </h1>
 <form action = "" method = "post" enctype=multipart/form-data>
 <input type = "file" name = file>
 <input type = "submit" value = Upload>
 </form>
 '''

然后为上传文件功能单独做一个路由,是专门用一个页面来提供上传文件

file=request.files['file']表示,从request请求的files字典中,取出file对应的文件。这个文件是一个FileStorage对象,这个我们后面再讲

这个文件对象拥有一个函数功能来保存文件,叫做save()

这个文件对象还拥有一个属性来提取文件名,叫做filename

他的参数就是路径名称

如上面代码,我用了os.path.join拼接的方法来做出保存路径名

至于提交保存以后的返回页面,我先简单做了一个 显示 success的页面表示功能成功

而整个页面的渲染,直接在return里面写入了这个表单,我们来看看功能

PS: 在用户资料页面,我已经加入了按钮来通向更改头像的页面,这个就不多说了

Flask 上传自定义头像的实例详解

Flask 上传自定义头像的实例详解

好,最重要的一环节上传文件已经完成了,接下来的工作就是对代码的完善了

比如,添加指定允许文件类型的范围

ALLOWED_EXTENSIONS=set(['txt','pdf','png','jpg','jpeg','gif'])

于是乎,代码变成了

UPLOAD_FOLDER=r'E:\flasky\app\upload'
ALLOWED_EXTENSIONS=set(['txt','pdf','png','jpg','jpeg','gif'])
 
def allowed_file(filename):
 return '.' in filename and filename.rsplit('.',1)[1] in ALLOWED_EXTENSIONS
 
@main.route('/upload_file',methods = ['GET','POST'])
def upload_file():
 if request.method == 'POST':
 file = request.files['file']
 if file and allowed_file(file.filename):
 file.save(os.path.join(UPLOAD_FOLDER,file.filename))
 return '<p>success</p>'
 return '<p> 你上传了不允许的文件类型 </p>'
 return '''
 <!DOCTYPE html>
 <title>Change new icon</title>
 <h1>Upload new </h1>
 <form action = "" method = "post" enctype=multipart/form-data>
 <input type = "file" name = file>
 <input type = "submit" value = Upload>
 </form>
 '''

好,讲到这里,就要回过头来看看Flask官方文档的说明了

首先第一点,request的files属性

Flask 上传自定义头像的实例详解

所以说,非常方便,可以通过file.filename ,直接获取文件的名字

另外,这个文件对象,可以直接用save功能储存,2可以有2个参数,一个是dst表示存放路径,第二个是缓存尺寸,表示在存储过程中的大小,默认16kb。

我们来看下效果,我们用MP3后缀名的文件来进行测试

我在检测到是不允许的文件类型时,返回写了一句提示

Flask 上传自定义头像的实例详解

接着,我们要再讲一个功能 secure_filename(),他是防止用于起一些可以影响到系统运行的文件名,来扰乱你的网站

比如如官方文档所说的

Flask 上传自定义头像的实例详解

再来看下这个函数的功能,其实他为了保证文件名不会影响到系统,他就把文件名里面的斜杠和空格,替换成了下划线

这样,就保证了文件只会在当前目录使用,而不会由于路径问题被利用去做其他事情。

Flask 上传自定义头像的实例详解

所以,在储存文件之前,通过这个函数把文件名先修改一下

@main.route('/upload_file',methods = ['GET','POST'])
def upload_file():
 if request.method == 'POST':
 file = request.files['file']
 if file and allowed_file(file.filename):
 filename = secure_filename(file.filename)
 file.save(os.path.join(UPLOAD_FOLDER,filename))
 return '<p>success</p>'
 return '<p> 你上传了不允许的文件类型 </p>'
 return '''
 <!DOCTYPE html>
 <title>Change new icon</title>
 <h1>Upload new </h1>
 <form action = "" method = "post" enctype=multipart/form-data>
 <input type = "file" name = file>
 <input type = "submit" value = Upload>
 </form>
 '''

我们再来测试下功能

Flask 上传自定义头像的实例详解

最后,还有一个功能,就是立即查看已经刚刚上传的文件

我这里创建了一个jpg图像文件

这里需要用到的函数是send_from_directory

Flask 上传自定义头像的实例详解

我们将上传的代码再次修改一下,变成上传完以后立刻预览

UPLOAD_FOLDER=r'E:\flasky\app\upload'
ALLOWED_EXTENSIONS=set(['txt','pdf','png','jpg','jpeg','gif'])
 
def allowed_file(filename):
 return '.' in filename and filename.rsplit('.',1)[1] in ALLOWED_EXTENSIONS
 
@main.route('/upload_file',methods = ['GET','POST'])
def upload_file():
 if request.method == 'POST':
 file = request.files['file']
 if file and allowed_file(file.filename):
 filename = secure_filename(file.filename)
 file.save(os.path.join(UPLOAD_FOLDER,filename))
 return redirect(url_for('.uploaded_file',filename=filename))  #跳转到预览页面
 return '<p> 你上传了不允许的文件类型 </p>'
 return '''
 <!DOCTYPE html>
 <title>Change new icon</title>
 <h1>Upload new </h1>
 <form action = "" method = "post" enctype=multipart/form-data>
 <input type = "file" name = file>
 <input type = "submit" value = Upload>
 </form>
 '''
 
@main.route('/uploaded_file/<filename>')
def uploaded_file(filename):
 return send_from_directory(UPLOAD_FOLDER,filename)

我创建了一张t.jpg的图片,里面用文本框写了一句话,也就是下面预览里面看到的

Flask 上传自定义头像的实例详解

到这里为止,基本的上传和预览功能就实现了,后面还要再和用户头像挂钩,还得再动动脑子。

以上这篇Flask 上传自定义头像的实例详解就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持三水点靠木。

Python 相关文章推荐
详解Python中的各种函数的使用
May 24 Python
python3实现暴力穷举博客园密码
Jun 19 Python
python实现应用程序在右键菜单中添加打开方式功能
Jan 09 Python
python 读取摄像头数据并保存的实例
Aug 03 Python
Python 3.3实现计算两个日期间隔秒数/天数的方法示例
Jan 07 Python
基于django channel实现websocket的聊天室的方法示例
Apr 11 Python
python 对字典按照value进行排序的方法
May 09 Python
由面试题加深对Django的认识理解
Jul 19 Python
代码总结Python2 和 Python3 字符串的区别
Jan 28 Python
python生成大写32位uuid代码
Mar 03 Python
python 偷懒技巧——使用 keyboard 录制键盘事件
Sep 21 Python
Appium中scroll和drag_and_drop根据元素位置滑动
Feb 15 Python
flask 实现上传图片并缩放作为头像的例子
Jan 09 #Python
python中如何使用insert函数
Jan 09 #Python
Python Pillow.Image 图像保存和参数选择方式
Jan 09 #Python
python 解决flask 图片在线浏览或者直接下载的问题
Jan 09 #Python
Django密码存储策略分析
Jan 09 #Python
python 实现Flask中返回图片流给前端展示
Jan 09 #Python
Python注释、分支结构、循环结构、伪“选择结构”用法实例分析
Jan 09 #Python
You might like
PHP 将图片按创建时间进行分类存储的实现代码
2010/01/05 PHP
php去除换行(回车换行)的三种方法
2014/03/26 PHP
php基于curl实现随机ip地址抓取内容的方法
2016/10/11 PHP
解决form中action属性后面?传递参数 获取不到的问题
2017/07/21 PHP
php过滤htmlspecialchars() 函数实现把预定义的字符转换为 HTML 实体用法分析
2019/06/25 PHP
用jscript实现列出安装的软件列表
2007/06/18 Javascript
JavaScript函数的4种调用方法详解
2014/04/22 Javascript
JQuery分屏指示器图片轮换效果实例
2015/05/21 Javascript
JavaScript实现图片轮播的方法
2015/07/31 Javascript
javascript中错误使用var造成undefined
2016/03/31 Javascript
jQuery checkbox选中问题之prop与attr注意点分析
2016/11/15 Javascript
selenium 与 chrome 进行qq登录并发邮件操作实例详解
2017/04/06 Javascript
Vue 中axios配置实例详解
2018/07/27 Javascript
vue基础之事件简写、事件对象、冒泡、默认行为、键盘事件实例分析
2019/03/11 Javascript
[01:03:50]DOTA2-DPC中国联赛 正赛 CDEC vs DLG BO3 第二场 2月7日
2021/03/11 DOTA
python 基础学习第二弹 类属性和实例属性
2012/08/27 Python
使用Python写一个贪吃蛇游戏实例代码
2017/08/21 Python
解决Pandas to_json()中文乱码,转化为json数组的问题
2018/05/10 Python
Scrapy使用的基本流程与实例讲解
2018/10/21 Python
Python合并同一个文件夹下所有PDF文件的方法
2019/03/11 Python
python:按行读入,排序然后输出的方法
2019/07/20 Python
python base64库给用户名或密码加密的流程
2020/01/02 Python
Python新手学习raise用法
2020/06/03 Python
Keras自定义IOU方式
2020/06/10 Python
使用Nibabel库对nii格式图像的读写操作
2020/07/01 Python
微信小程序canvas实现水平、垂直居中效果
2020/02/05 HTML / CSS
幼儿园中班开学寄语
2014/04/03 职场文书
软件项目开发计划书
2014/05/01 职场文书
服务承诺口号
2014/05/22 职场文书
2015年清明节活动总结
2015/02/09 职场文书
2015年反腐倡廉工作总结
2015/05/14 职场文书
2015迎新晚会开场白
2015/07/17 职场文书
公司要求试用期员工提交“述职报告”,该怎么写?
2019/07/17 职场文书
python使用PySimpleGUI设置进度条及控件使用
2021/06/10 Python
MySQL 数据恢复的多种方法汇总
2021/06/21 MySQL
Redis Stream类型的使用详解
2021/11/11 Redis