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()
注意事项:
将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(八)的更多相关文章
- flask完成文件上传功能
在使用flask定义路由完成文件上传时,定义upload视图函数 from flask import Flask, render_template from werkzeug.utils import ...
- JSP入门 文件上传
commons-fileupload public void save(HttpServletRequest request,HttpServletResponse response) throws ...
- Spring Boot入门——文件上传与下载
1.在pom.xml文件中添加依赖 <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="ht ...
- Django处理文件上传File Uploads
HttpRequest.FILES 表单上传的文件对象存储在类字典对象request.FILES中,表单格式需为multipart/form-data <form enctype="m ...
- flask的文件上传和下载
http://flask.pocoo.org/docs/1.0/api/ http://docs.jinkan.org/docs/flask/api.html?highlight=download h ...
- Flask插件wtforms、Flask文件上传和Echarts柱状图
一.wtforms 类比Django的Form组件Form组件的主要应用是帮助我们自动生成HTML代码和做一些表单数据的验证 flask的wtforms用法跟Form组件大同小异参考文章:https: ...
- shutil模块和几种文件上传Demo
一.shutil模块 1.介绍 shutil模块是对os中文件操作的补充.--移动 复制 打包 压缩 解压 2.基本使用 1. shutil.copyfileobj(文件1, 文件2, 长度) 将文件 ...
- Yii2表单提交(带文件上传)
今天写一个php的表单提交接口,除了基本的字符串数据,还带文件上传,不用说前端form标签内应该有这些属性 <form enctype="multipart/form-data&quo ...
- SpringBoot 文件上传、下载、设置大小
本文使用SpringBoot的版本为2.0.3.RELEASE 1.上传单个文件 ①html对应的提交表单 <form action="uploadFile" method= ...
随机推荐
- LeetCode268.缺失数字
268.缺失数字 描述 给定一个包含 0, 1, 2, ..., n 中 n 个数的序列,找出 0 .. n 中没有出现在序列中的那个数. 示例 示例 1: 输入: [3,0,1] 输出: 2 示例 ...
- 洛谷 P1560 [USACO5.2]蜗牛的旅行Snail Trails
题目链接 题解 一看题没什么思路.写了个暴力居然可过?! Code #include<bits/stdc++.h> #define LL long long #define RG regi ...
- C. Enlarge GCD Codeforces Round #511 (Div. 2)【数学】
题目: Mr. F has nn positive integers, a1,a2,…,an. He thinks the greatest common divisor of these integ ...
- springboot(四)-项目部署
Springboot和我们之前学习的web应用程序不一样,其本质上是一个java应用程序.部署的方式有两种:打成jar包,或者打成war包. 打成jar包 切换到项目文件中 然后mvn install ...
- PHP返回变量或数组的字符串表示:var_export()
使用var_export()函数可以在服务端程序没有在打印的情况下,配合file_put_contents方便的调试程序,查看变量和数组的内容. 在开发过程中,我们常用var_dump()来打印数组内 ...
- 剑指offer——面试题8:二叉树的下一个节点
// 面试题8:二叉树的下一个结点 // 题目:给定一棵二叉树和其中的一个结点,如何找出中序遍历顺序的下一个结点? // 树中的结点除了有两个分别指向左右子结点的指针以外,还有一个指向父结点的指针. ...
- git 代码统计
查看git上的个人代码提交量: git log --author="Marek Romanowski" --since="2019-01-01" --no-me ...
- JS如何获取屏幕、浏览器及网页高度宽度?
屏幕的尺寸是指当前分辨率下的高度.宽度,而不是物理高度.宽度. 如:一个22寸的显示器,屏幕分辨率为1366 * 768,那么我们可以获取到的屏幕高度为1366px,宽度为768px. 屏幕宽度和高度 ...
- Basic Data Structures and Algorithms in the Linux Kernel--reference
http://luisbg.blogalia.com/historias/74062 Thanks to Vijay D'Silva's brilliant answer in cstheory.st ...
- jqgrid 增删改页面快速构建
<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="InvitationRout ...