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(八)的更多相关文章

  1. flask完成文件上传功能

    在使用flask定义路由完成文件上传时,定义upload视图函数 from flask import Flask, render_template from werkzeug.utils import ...

  2. JSP入门 文件上传

    commons-fileupload public void save(HttpServletRequest request,HttpServletResponse response) throws ...

  3. Spring Boot入门——文件上传与下载

    1.在pom.xml文件中添加依赖 <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="ht ...

  4. Django处理文件上传File Uploads

    HttpRequest.FILES 表单上传的文件对象存储在类字典对象request.FILES中,表单格式需为multipart/form-data <form enctype="m ...

  5. flask的文件上传和下载

    http://flask.pocoo.org/docs/1.0/api/ http://docs.jinkan.org/docs/flask/api.html?highlight=download h ...

  6. Flask插件wtforms、Flask文件上传和Echarts柱状图

    一.wtforms 类比Django的Form组件Form组件的主要应用是帮助我们自动生成HTML代码和做一些表单数据的验证 flask的wtforms用法跟Form组件大同小异参考文章:https: ...

  7. shutil模块和几种文件上传Demo

    一.shutil模块 1.介绍 shutil模块是对os中文件操作的补充.--移动 复制 打包 压缩 解压 2.基本使用 1. shutil.copyfileobj(文件1, 文件2, 长度) 将文件 ...

  8. Yii2表单提交(带文件上传)

    今天写一个php的表单提交接口,除了基本的字符串数据,还带文件上传,不用说前端form标签内应该有这些属性 <form enctype="multipart/form-data&quo ...

  9. SpringBoot 文件上传、下载、设置大小

    本文使用SpringBoot的版本为2.0.3.RELEASE 1.上传单个文件 ①html对应的提交表单 <form action="uploadFile" method= ...

随机推荐

  1. P2762 太空飞行计划问题

    传送门 经典的最大权闭合子图问题 实验有正的价值,仪器的价值为负 为了实验我们必须选择相应的仪器 所以从 S 连向实验,边权为实验的价值 实验与相应仪器之间连边,边权为 INF 仪器连向 T 边权为仪 ...

  2. 在windows10下vs2017配置opencv4.0.0

    第一次配置时,有些.dll文件出错,所以用重新下载opencv配置了一遍,终于可以了,喜极而泣! 一.下载OpenCV4.0 直接到官网https://opencv.org/下载 然后在下个页面选择 ...

  3. Jquery动态绑定事件处理函数 bind / on / delegate

    1.bind方法绑定的事件处理函数不会应用到后来添加到DOM中的新元素.比如你在用bind给页面元素绑定事件之后,又新添加了一些与之前绑定过事件的元素一样的DOM元素,但是这些事件并不能在新的DOM元 ...

  4. 112th LeetCode Weekly Contest Validate Stack Sequences

    Given two sequences pushed and popped with distinct values, return true if and only if this could ha ...

  5. Android应用中添加Log4j的示例

    [2016-06-30]最新的log4j已经集成在DR_support_lib库中 具体请看: https://coding.net/u/wrcold520/p/DR_support_lib/git/ ...

  6. nginx 服务器配置文件指令

    localtion 配置        语法结构: location [ =  ~  ~* ^~ ] uri{ ... }        uri 变量是带匹配的请求字符, 可以是不含正则表达的字符串, ...

  7. 第二十一章:deploy and live updates

    通常我们开发一个app之后,需要把他们放到对应的应用商店上去以供下载.在此期间,需要经过应用商店的审核,包括初次上传和更新上传.短则需要数天,多则需要几个星期,这对于我们的快速产品迭代和hotfix来 ...

  8. spark运行时出现Neither spark.yarn.jars nor spark.yarn.archive is set错误的解决办法(图文详解)

    不多说,直接上干货! 福利 => 每天都推送 欢迎大家,关注微信扫码并加入我的4个微信公众号:   大数据躺过的坑      Java从入门到架构师      人工智能躺过的坑          ...

  9. ZOJ 1610——Count the Colors——————【线段树区间替换、求不同颜色区间段数】

    Count the Colors Time Limit:2000MS     Memory Limit:65536KB     64bit IO Format:%lld & %llu Subm ...

  10. JavaScript实现StringBuffer

    function StringBuffer() { this._strings = new Array(); } StringBuffer.prototype.Append = function(_s ...