Flask 文件上传
一、消息的展示
导入:
- flash 存入消息到列表
- get_flashed_messages 获取消息进行展示
概述:
当用户的某些状态发生了改变 需要给出信息提示
app.route('/test_form/',methods=['GET','POST'])
def test_form():
form = TestForm()
if form.validate_on_submit():
flash('传递过来的数据都对!')
flash('你们爽姐来了!')
print(get_flashed_messages())
base.html
{% block content %}
<div class="container">
{% for info in get_flashed_messages() %}
<div class="alert alert-success alert-dismissible" role="alert">
<button type="button" class="close" data-dismiss="alert" aria-label="Close"><span
aria-hidden="true">×</span></button>
{{ info }}
</div>
{% endfor %}
{% block pagecontent %}
base模板中填充内容部分
{% endblock %}
</div>
{% endblock %}
二、flask-moment用于时间处理的扩展库
安装:
pip3 install flask-moment
使用
from flask_moment import Moment
moment = Moment()
from datetime import datetime,timedelta
@app.route('/test_form/', methods=['GET', 'POST'])
def test_form():
form = TestForm()
time = datetime.utcnow()+timedelta(minutes=-5)
return render_template('testform.html', form=form,time=time)
html
{% extends 'common/base.html' %}
{% block pagecontent %}
{% from 'bootstrap/wtf.html' import quick_form %}
{{ quick_form(form) }}
{# 时间的展示 #}
<ul>
<li>{{ moment(time).format('L') }}</li>
<li>{{ moment(time).format('LL') }}</li>
<li>{{ moment(time).format('LLL') }}</li>
<li>{{ moment(time).format('LLLL') }}</li>
<li>{{ moment(time).format('Y-M-D H:m:s') }}</li>
<li>{{ moment(time).fromNow()}}</li>
</ul>
{% endblock %}
{% block scripts %}
{{ super() }}
{# 加载moment显示时间的js代码 #}
{{ moment.include_moment() }}
{{ moment.locale('zh-CN') }}
{% endblock %}
http://momentjs.com/docs/#/displaying/
扩展库:
- flask-sqlalchemy
- flask-cache
- flask-login
- flask-uploads
- flask-mail
三、原生文件上传
注意:
如果文件上传失败
- enctype值是否更改
- input的name是否有值
upload.html
{% extends 'common/base.html' %}
{% block title %}
文件上传
{% endblock %}
{% block pagecontent %}
<h2>文件上传</h2>
<form action="" method="post" enctype="multipart/form-data">
<p>选择文件: <input type="file" name="file"></p>
<p><input type="submit" value="submit"></p>
</form>
{% endblock %}
from flask import Flask,render_template,request
from flask_bootstrap import Bootstrap
from flask_script import Manager
import os
app = Flask(__name__)
PATH = os.path.join(os.getcwd(),'static/upload')
Bootstrap(app)
manager = Manager(app)
#原生文件上传
@app.route('/upload/',methods=['GET','POST'])
def upload():
print(request.files)
file = request.files.get('file')
if request.method == 'POST' and file:
print('文件名称为',file.filename)
file.save(os.path.join(PATH,file.filename))
return render_template('upload.html')
if __name__ == '__main__':
manager.run()
添加过滤条件的上传
from flask import Flask,render_template,request,flash
from flask_bootstrap import Bootstrap
from flask_script import Manager
import string,random,os
#pip3 install pillow
from PIL import Image
app = Flask(__name__)
app.config['MAX_CONTENT_LENGTH'] = 1024*1024*64 #限制上传文件的大小
ALLOWED_FILES = ['jpg','jpeg','gif','png'] #允许上传的文件类型
PATH = os.path.join(os.getcwd(),'static/upload')
Bootstrap(app)
manager = Manager(app)
"""
1.拿到上传文件对象
2.限制文件的大小
3.设置允许上传的文件的类型
4.生成随机的图片名称
5.进行保存
6.进行缩放处理
7.模板展示上传成功以后的图片
"""
def random_name(suffix,length=32):
Str = string.ascii_letters+string.digits
while True:
newName = ''.join(random.choice(Str) for i in range(length)) +'.'+ suffix
path = os.path.join(PATH, newName)
if not os.path.exists(path):
break
return path,newName
#图片缩放
def img_zoom(picInfo,prefix='s',width=300,height=300):
# 图片缩放
img = Image.open(picInfo[0])
img.thumbnail((width, height)) # 重新设计尺寸
path = os.path.split(picInfo[0])
newPath = os.path.join(path[0],prefix+'_'+path[1])
img.save(newPath)
return prefix+'_'+path[1]
#原生文件上传
@app.route('/upload/',methods=['GET','POST'])
def upload():
img_name = None
print(request.files)
file = request.files.get('file')
if request.method == 'POST' and file:
filename = file.filename
suffix = filename.split('.')[-1]
if suffix not in ALLOWED_FILES:
flash('该文件类型不允许上传')
else:
picInfo = random_name(suffix) #获取图片新名称
file.save(picInfo[0])
# img_name = picInfo[1]
# 处理图片缩放
img_name = img_zoom(picInfo)
img_zoom(picInfo,'m',400,400)
return render_template('upload.html',img_name=img_name)
四、flask-uploads上传
安装:
pip3 install flask-uploads
使用:
from flask import Flask,render_template,request,flash
from flask_bootstrap import Bootstrap
from flask_script import Manager
from flask_uploads import UploadSet,configure_uploads,patch_request_class,IMAGES
import os
app = Flask(__name__)
app.config['MAX_CONTENT_LENGTH'] = 1024*1024*64
app.config['UPLOADED_PHOTO_DEST'] = os.path.join(os.getcwd(),'static/upload')
Bootstrap(app)
file = UploadSet('photo',IMAGES)
configure_uploads(app,file)
patch_request_class(app,size=None)
manager = Manager(app)
#原生文件上传
@app.route('/upload/',methods=['GET','POST'])
def upload():
img_name = None
if request.method == 'POST' and request.files.get('file'):
filename = file.save(request.files.get('file'))
img_name = filename
return render_template('upload.html',img_name=img_name)
if __name__ == '__main__':
manager.run()
最终版本的上传
from flask import Flask,render_template,request,flash
from flask_bootstrap import Bootstrap
from flask_script import Manager
from flask_uploads import UploadSet,configure_uploads,patch_request_class,IMAGES
import os
from flask_wtf import FlaskForm
from wtforms import SubmitField
from flask_wtf.file import FileAllowed,FileRequired,FileField
app = Flask(__name__)
app.config['SECRET_KEY'] = '123kjdshakjshja;'
app.config['MAX_CONTENT_LENGTH'] = 1024*1024*64
app.config['UPLOADED_PHOTO_DEST'] = os.path.join(os.getcwd(),'static/upload')
Bootstrap(app)
file = UploadSet('photo',IMAGES)
configure_uploads(app,file)
patch_request_class(app,size=None)
manager = Manager(app)
class Upload(FlaskForm):
photo = FileField('选择头像',validators=[FileAllowed(file,message='该文件类型不允许上传!'),FileRequired('文件不能为空!')])
submit = SubmitField('上传')
#原生文件上传
@app.route('/upload/',methods=['GET','POST'])
def upload():
img_url = None
form = Upload()
if form.validate_on_submit():
filename = file.save(form.photo.data)
img_url = file.url(filename)
return render_template('upload2.html',img_url=img_url,form=form)
if __name__ == '__main__':
manager.run()
html
{% extends 'common/base.html' %}
{% block title %}
最终版本文件上传
{% endblock %}
{% block pagecontent %}
{% if img_url %}
{{ img_url }}
<img src="{{ img_url }}" alt="">
{% endif %}
{% from 'bootstrap/wtf.html' import quick_form %}
{{ quick_form(form) }}
{% endblock %}