Flask入门文件上传flask-uploads(八)
1 视图传递多个参数
(1) 普通传参 : 关键字参数传递
return render_template('模板名称.html',arg1=val1,arg2=val2...)
(2) 字典传参 : 以字典的形式传递
dict = { key1:value1, key2:value2, .... } return render_template('模板名称.html',dict)
(3) 全局变量g传递
视图中:
@app.route('/test') def test(): g.name = '张三' g.sex = '男' return render_template('test.html')
模板中
<h2>{{ g.name }}</h2> <h2>{{ g.sex }}</h2>
(4) 传递全部的本地变量给template,使用locals()**,直接获取变量值
@app.route('/test') def test(): name = '张三' sex = '男' return render_template('test.html',**locals())
test.html中
<h2>{{ name }}</h2> <h2>{{ sex }}</h2>
2 错误页面定制
#制定捕获404和500的错误页面 @app.errorhandler(404) def page_not_found(e): return render_template('error.html',error=e,code=404) @app.errorhandler(500) def page_not_found(e): #接受参数e,并传给错误error return render_template('error.html',error=e,code=500)
指定错误页面:只需要一个错误模板页面即可
{% extends 'common/boot_base.html' %} {% block title %} {{ code }} #标题显示500 {% endblock %} {% block page_content %} <div class="alert alert-danger" role="alert">{{ error }} #显示错误页面信息 </div> {% endblock %}
3 文件上传
(1) 静态资源的加载
{{ url_for('static',filename='img/mei.jpg') }} {{ url_for('static',filename='css/style.css') }} {{ url_for('static',filename='js/mei.js') }} #注:static是内置的视图函数,我们通过其找到路由
(2) 原生文件上传
模板文件
{% if newName %} #newName非空 图片名传入 <img src='{{ url_for("static",filename=newName) }}' alt=''> {% endif %} #视图函数upLoad <form action="{{ url_for('upLoad') }}" enctype='multipart/form-data' method='post'> <input type='file' name='file'> <p><input type='submit' value='submit'></p> </form>
主文件manage.py
from flask import Flask,render_template,request from flask_script import Manager from flask_bootstrap import Bootstrap import os from PIL import Image #python图片处理库 app = Flask(__name__) #允许上传的后缀名,放在配置文件 app.config['ALLOWED_EXTENSIONS'] = ['.jpg','.jpeg','.png','.gif'] #上传文件的大小 app.config['MAX_CONTENT_LENGTH'] = 1024*1024*60 #配置文件上传的路径 app.config['UPLOAD_FOLDER'] = os.getcwd() + '/static' #绑定bootstrap bootstrap = Bootstrap(app) manager = Manager(app) @app.route('/') def index(): return render_template('index.html') #生成随机图片名称的函数 def new_name(shuffix,length=32): import string,random myStr = string.ascii_letters + '0123456789' newName = ''.join(random.choice(myStr) for i in range(length)) return newName+shuffix #定义判断后缀是否可用函数,返回true/false def allowed_file(shuffix): return shuffix in app.config['ALLOWED_EXTENSIONS'] @app.route('/upload',methods=['GET','POST']) def upload(): img_name = None if request.method == 'POST': file = request.files.get('file') #获取上传文件的名称 filename = file.filename #分割路径,返回路径名和文件扩展名的元组 shuffix = os.path.splitext(filename)[-1] if allowed_file(shuffix): #为真则生成随机名称 newName = new_name(shuffix) img_name = newName #拼凑完整的路径 newPath = os.path.join(app.config['UPLOAD_FOLDER'],newName) file.save(newPath) #处理图片的缩放 img = Image.open(newPath) #重新设置大小与尺寸 img.thumbnail((200,200)) img.save(newName) #跳转上传页面并返回newName return render_template('upload.html',newName=img_name)
4 flask-uploads扩展库
安装
pip3 install flask-uploads
类UploadSet : 文件上传配置集合,包含三个参数:
name:文件上传配置集合的名称,默认files
extensions:上传文件类型,默认DEFAULTS = TEXT + DOCUMENTS + IMAGES + DATA
default_dest:上传文件的默认存储路径,我们可以通过app.config[‘UPLOADS_DEFAULT_DEST’]来指定
方法 : configure_uploads
应用配置好之后,调用此方法,扫描上传配置选项并保存到我们的应用中,注册上传模块。
下面我们来看下 (flask-uploads库 + flask-wtf 库) 的写法
模板文件
{% extends 'common/base.html' %} #继承 {% block title %} 首页 {% endblock %} {% import 'bootstrap/wtf.html' as wtf %} #导入 {% block page_content %} <img src="{{ url_for('static',filename=newName) }}" alt=""> {{ wtf.quick_form(form) }} #快速渲染 {% endblock %}
主启动文件
from flask import Flask,render_template,request from flask_script import Manager from flask_bootstrap import Bootstrap import os from flask_uploads import UploadSet,IMAGES,configure_uploads,patch_request_class #导入库中验证的字段类 from flask_wtf import FlaskForm from wtforms import FileField,SubmitField from flask_wtf.file import FileAllowed,FileRequired app = Flask(__name__) #允许上传的后缀 app.config['SECRET_KEY'] = 'image' app.config['MAX_CONTENT_LENGTH'] = 1024*1024*64 #64兆 #配置文件上传的路径 app.config['UPLOADED_PHOTOS_DEST'] = os.getcwd()+'/static/upload' #实例化一个file对象 photos与PHOTOS要对应 file = UploadSet('photos',IMAGES) #将 app 的 config 配置注册到 UploadSet 实例 file configure_uploads(app,file) #限制上传文件的大小 size=None不采用默认size=64*1024*1024 patch_request_class(app,size=None) bootstrap = Bootstrap(app) manager = Manager(app) class File(FlaskForm): file = FileField('文件上传',validators=[FileRequired(message='您还没有选择文件'),FileAllowed(file,message='只能上擦图片')]) submit = SubmitField('上传') #生成随机图片名称的函数 def new_name(shuffix,length=32): import string, random myStr = string.ascii_letters + '0123456789' newName = ''.join(random.choice(myStr) for i in range(length)) return newName+shuffix @app.route('/upload',methods=['GET','POST']) def upload(): form = File() img_url = None #验证数据 if form.validate_on_submit(): shuffix = os.path.splitext(form.file.data.filename)[-1] newName = new_name(shuffix=shuffix) file.save(form.file.data,name=newName) img_url = file.url(newName) return render_template('boot_upload.html',newName=img_url,form=form) if __name__ == '__main__': manager.run()
注意事项:
python 将app的config配置注册到 UploadSet 实例file configure_uploads(app,file) 限制上传文件的大小 patch_request_class(app,size=None) file = UploadSet('photos',IMAGES) 实例化file对象继承了类中save() url() 内置方法 form = File() File类继承自FlaskForm 可以利用flask-uploads库进行验证 , 采用类File取代原生的Form表单访问通过 : 实例化form对象.字段名.data 访问字段对象 实例化form对象.字段名.data.属性名 访问字段对象对应的属性
推荐阅读
-
Python使用Flask框架同时上传多个文件的方法
-
hadoop入门之通过java代码实现将本地文件上传到hadoop的文件系统
-
python3 flask实现文件上传功能
-
Flask上传文件
-
Azure IoT Hub 十分钟入门系列 (4)- 实现从设备上传日志文件/图片到 Azure Storage
-
Azure IoT Hub 十分钟入门系列 (10)- 实现云端接收设备文件上传通知(file upload notification,Node.js示例)
-
Flask入门文件上传flask-uploads(八)
-
flask利用flask-wtf验证上传的文件的方法
-
Python使用Flask框架同时上传多个文件的方法
-
python3中flask上传文件:图像.jpg