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: 在用户资料页面,我已经加入了按钮来通向更改头像的页面,这个就不多说了
好,最重要的一环节上传文件已经完成了,接下来的工作就是对代码的完善了
比如,添加指定允许文件类型的范围
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属性
所以说,非常方便,可以通过file.filename ,直接获取文件的名字
另外,这个文件对象,可以直接用save功能储存,2可以有2个参数,一个是dst表示存放路径,第二个是缓存尺寸,表示在存储过程中的大小,默认16kb。
我们来看下效果,我们用MP3后缀名的文件来进行测试
我在检测到是不允许的文件类型时,返回写了一句提示
接着,我们要再讲一个功能 secure_filename(),他是防止用于起一些可以影响到系统运行的文件名,来扰乱你的网站
比如如官方文档所说的
再来看下这个函数的功能,其实他为了保证文件名不会影响到系统,他就把文件名里面的斜杠和空格,替换成了下划线
这样,就保证了文件只会在当前目录使用,而不会由于路径问题被利用去做其他事情。
所以,在储存文件之前,通过这个函数把文件名先修改一下
@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> '''
我们再来测试下功能
最后,还有一个功能,就是立即查看已经刚刚上传的文件
我这里创建了一个jpg图像文件
这里需要用到的函数是send_from_directory
我们将上传的代码再次修改一下,变成上传完以后立刻预览
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,上传,头像
《魔兽世界》大逃杀!60人新游玩模式《强袭风暴》3月21日上线
暴雪近日发布了《魔兽世界》10.2.6 更新内容,新游玩模式《强袭风暴》即将于3月21 日在亚服上线,届时玩家将前往阿拉希高地展开一场 60 人大逃杀对战。
艾泽拉斯的冒险者已经征服了艾泽拉斯的大地及遥远的彼岸。他们在对抗世界上最致命的敌人时展现出过人的手腕,并且成功阻止终结宇宙等级的威胁。当他们在为即将于《魔兽世界》资料片《地心之战》中来袭的萨拉塔斯势力做战斗准备时,他们还需要在熟悉的阿拉希高地面对一个全新的敌人──那就是彼此。在《巨龙崛起》10.2.6 更新的《强袭风暴》中,玩家将会进入一个全新的海盗主题大逃杀式限时活动,其中包含极高的风险和史诗级的奖励。
《强袭风暴》不是普通的战场,作为一个独立于主游戏之外的活动,玩家可以用大逃杀的风格来体验《魔兽世界》,不分职业、不分装备(除了你在赛局中捡到的),光是技巧和战略的强弱之分就能决定出谁才是能坚持到最后的赢家。本次活动将会开放单人和双人模式,玩家在加入海盗主题的预赛大厅区域前,可以从强袭风暴角色画面新增好友。游玩游戏将可以累计名望轨迹,《巨龙崛起》和《魔兽世界:巫妖王之怒 经典版》的玩家都可以获得奖励。
更新动态
- 陈柏宇.2011-QUINQUENNIUM【SONY】【WAV+CUE】
- 《51首热门当红歌曲 十大顶级发烧女声 3CD》[WAV+CUE][1.6GB]
- 《赵传 深受摇滚迷青睐的台湾音乐人 约定》[WAV+CUE][320MB]
- 《庄心妍 实力唱将 发烧音乐精选集》[WAV+CUE][380MB]
- [音展纪念碟]2006年《TAA台湾第十六届国际HI-ENDHI-FI音响展》2cd[WAV]
- 中国音乐地图之听见西藏山歌牧歌酒歌2020[WAV分轨]
- 王宏伟2017-永远的红飘带[太平洋影音][WAV+CUE]
- 费翔.1997-NOW现在【第一中国】【WAV+CUE】
- 新格合唱团.1981-我唱你和2辑(滚石新格民歌系列)【新格】【WAV+CUE】
- 陈柏宇.2011-QUINQUENNIUM【SONY】【WAV+CUE】
- 雨果唱片-《金唛系列-蔷薇依韵琼瑶》WAV
- 陈百强《凝望(2012华纳LPCD45限量版)[DMI]》[WAV整轨]
- 模拟之声慢刻CD《徐小凤45周年》[德国母带][低速原抓WAV+CUE]
- 《庄心妍 实力唱将 发烧音乐精选集》[WAV+CUE][380MB]
- 《王菲 单曲合集》[FlAC/分轨][520MB]