分享web开发知识

注册/登录|最近发布|今日推荐

主页 IT知识网页技术软件开发前端开发代码编程运营维护技术分享教程案例
当前位置:首页 > 运营维护

Flask入门文件上传flask-uploads(八)

发布时间:2023-09-06 01:57责任编辑:傅花花关键词:upload文件上传

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,requestfrom flask_script import Managerfrom flask_bootstrap import Bootstrapimport osfrom 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‘#绑定bootstrapbootstrap = 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/falsedef 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,requestfrom flask_script import Managerfrom flask_bootstrap import Bootstrapimport osfrom flask_uploads import UploadSet,IMAGES,configure_uploads,patch_request_class#导入库中验证的字段类from flask_wtf import FlaskFormfrom wtforms import FileField,SubmitFieldfrom flask_wtf.file import FileAllowed,FileRequiredapp = 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 实例 fileconfigure_uploads(app,file)#限制上传文件的大小 ??size=None不采用默认size=64*1024*1024patch_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.属性名 ???访问字段对象对应的属性

Flask入门文件上传flask-uploads(八)

原文地址:https://www.cnblogs.com/why957/p/9131010.html

知识推荐

我的编程学习网——分享web前端后端开发技术知识。 垃圾信息处理邮箱 tousu563@163.com 网站地图
icp备案号 闽ICP备2023006418号-8 不良信息举报平台 互联网安全管理备案 Copyright 2023 www.wodecom.cn All Rights Reserved