Flask—04-文件上传与邮件发送(自带优化)
文件上传与邮件发送
可以按照标题分别直接粘贴对应的文件夹,运行直接用:
原生上传
模板文件
<form method="post" enctype="multipart/form-data">
<input type="file" name="photo" /><br />
<input type="submit" value="上传" />
</form>
视图函数
@app.route('/upload/', methods=['GET', 'POST'])
def upload():
if request.method == 'POST':
# 获取上传对象
photo = request.files.get('photo')
if photo:
# 保存上传文件,参数是文件保存的路径名
photo.save(photo.filename)
return '文件上传成功'
return '文件上传失败'
return render_template('upload.html')
优化完善
import os
from flask import send_from_directory # 上传文件保存位置
app.config['UPLOADED_FOLDER'] = os.path.join(os.getcwd(), 'static/upload')
# 请求大小(文件大小限制)
app.config['MAX_CONTENT_LENGTH'] = 1024 * 1024 * 8 # 判断是否是允许的文件类型
def allowed_file(filename):
return '.' in filename and filename.rsplit('.', 1)[1] in ALLOWED_SUFFIX # 展示上传的文件
@app.route('/uploaded/<filename>')
def upladed(filename):
# 安全的发送文件
return send_from_directory(app.config['UPLOADED_FOLDER'], filename) @app.route('/upload/', methods=['GET', 'POST'])
def upload():
img_url = None
if request.method == 'POST':
# 获取上传对象
photo = request.files.get('photo')
# 保存前验证文件的类型
if photo and allowed_file(photo.filename):
# 拼接文件保存的完整路径名
pathname = os.path.join(app.config['UPLOADED_FOLDER'],
photo.filename)
# 保存上传文件,参数是文件保存的路径名
photo.save(pathname)
img_url = url_for('upladed', filename=photo.filename)
return render_template('upload.html', img_url=img_url)
优化:大小限定、类型限定、保存位置、查看上传文件
flask-uploads
说明:极大地优化了文件上传的操作,使用非常方便
安装:
pip install flask-uploads
使用:
- 配置
from flask_uploads import UploadSet, IMAGES
from flask_uploads import configure_uploads
from flask_uploads import patch_request_class
import os app = Flask(__name__)
# 设置文件的大小:8M=8*1024*1024k
app.config['MAX_CONTENT_LENGTH'] = 1024 * 1024 * 8
app.config['UPLOADED_PHOTOS_DEST'] = os.path.join(os.getcwd(), 'static/upload')
# 创建上传对象,指定名字和上传文件的类型
photos = UploadSet('photos', IMAGES)
# 配置上传对象
configure_uploads(app, photos)
# 设置上传文件大小,默认64M,设置为None,大小由MAX_CONTENT_LENGTH决定
patch_request_class(app, size=None)
- 视图函数
@app.route('/upload/', methods=['GET', 'POST'])
def upload():
img_url = None
if request.method == 'POST':
# 获取上传对象
photo = request.files.get('photo')
if photo:
# 保存上传文件
photos.save(photo)
# 获取上传文件的地址
img_url = photos.url(photo.filename)
return render_template('upload.html', img_url=img_url)
- 优化上传:生成随机文件名,生成缩略图(PIL模块,只支持py2,py3中使用需要安装pillow)
# 生成随机字符串
def random_string(length=32):
import random
base_str = 'abcdefghijklmnopqrstuvwxyz1234567890'
return ''.join(random.choice(base_str) for i in range(length)) @app.route('/upload/', methods=['GET', 'POST'])
def upload():
img_url = None
if request.method == 'POST':
# 获取上传对象
photo = request.files.get('photo')
if photo:
# 提取文件后缀
suffix = os.path.splitext(photo.filename)[1]
# 生成随机文件名
filename = random_string() + suffix
# 保存上传文件
photos.save(photo, name=filename)
# 生成缩略图
from PIL import Image
# 拼接完整路径名
pathname = os.path.join(app.config['UPLOADED_PHOTOS_DEST'], filename)
# 打开文件
img = Image.open(pathname)
# 设置大小
img.thumbnail((64, 64))
# 保存修改后的图片
img.save(pathname)
# 获取上传文件的地址
img_url = photos.url(filename)
return render_template('upload.html', img_url=img_url)
综合使用
- 要求:结合
flask-bootstrap、flask-wtf、flask-uploads
等实现文件上传 - 使用:
- 各种配置及对象创建
- 注意对象创建的先后顺序
- 上传文件的校验处理过程与上面一样
flask-mail
说明:专门用来实现邮件发送的扩展库,使用非常方便。
安装:
pip install flask-mail
使用:
from flask_mail import Mail, Message
import os # 邮件配置,一定要放在对象创建之前
# 邮箱服务器:不同类型邮箱服务器不同,不知道的请百度
app.config['MAIL_SERVER'] = 'smtp.xxx.com'
# 用户名
app.config['MAIL_USERNAME'] = 'xxx@xxx.com'
# 密码:如果密码添加到了环境变量可以直接引用'MAIL_PASSWORD',否则直接把'123456'换成自己的邮箱密码。
app.config['MAIL_PASSWORD'] = os.getenv('MAIL_PASSWORD', '123456') # 创建发送邮件的对象
mail = Mail(app) @app.route('/send/')
def send():
# 创建邮件消息对象
msg = Message('账户激活',
recipients=['xxx@qq.com'],
sender=app.config['MAIL_USERNAME'])
# 设置邮件内容
msg.html = '恭喜你,中奖了!'
# 发送邮件
mail.send(msg)
return '邮件发送成功'
总结:
- 书写邮箱相关配置
- 创建发送邮件的(Mail)对象
- 创建邮件消息(Message)对象
- 使用mail的send方法发送邮件
封装函数发送邮件
# 封装函数发送邮件
def send_mail(subject, to, template, **kwargs):
# 处理邮件接收者
if isinstance(to, list):
recipients = to
elif isinstance(to, str):
recipients = to.split(',')
else:
raise Exception('邮件接收者参数有误')
# 创建邮件消息对象
msg = Message(subject=subject, recipients=recipients,
sender=app.config['MAIL_USERNAME'])
# 设置邮件内容
msg.html = render_template(template, **kwargs)
# 发送邮件
mail.send(msg) @app.route('/send/')
def send():
# 调用函数即可发送邮件
send_mail('账户激活', 'xxx@qq.com', 'activate.html', name='八戒')
return '邮件发送成功'
异步发送邮件
from flask import current_app
from threading import Thread # 异步发送邮件
def async_send_mail(app, msg):
# 邮件发送必须在程序上下文中进行
# 新的线程没有上下文,因此需要手动创建上下文
with app.app_context():
mail.send(msg) # 封装函数发送邮件
def send_mail(subject, to, template, **kwargs):
# 处理邮件接收者
if isinstance(to, list):
recipients = to
elif isinstance(to, str):
recipients = to.split(',')
else:
raise Exception('邮件接收者参数有误')
# 从代理中获取原始对象
app = current_app._get_current_object()
# 创建邮件消息对象
msg = Message(subject=subject,recipients=recipients,sender=app.config['MAIL_USERNAME'])
# 设置邮件内容
msg.html = render_template(template, **kwargs)
# 发送邮件:同步发送,会阻塞运行
# mail.send(msg)
# 创建一个线程,在新的线程中发送邮件
thr = Thread(target=async_send_mail, args=(app, msg))
# 启动线程
thr.start()
# 返回线程
return thr
QQ邮箱发送配置
# 密码,QQ邮箱需要使用授权码
app.config['MAIL_PASSWORD'] = os.getenv('MAIL_PASSWORD', '123456')
# QQ邮箱配置
# app.config['MAIL_PORT'] = 465
# 加密传输
# app.config['MAIL_USE_SSL'] = True
Flask—04-文件上传与邮件发送(自带优化)的更多相关文章
- SpringBoot项目实现文件上传和邮件发送
前言 本篇文章主要介绍的是SpringBoot项目实现文件上传和邮件发送的功能. SpringBoot 文件上传 说明:如果想直接获取工程那么可以直接跳到底部,通过链接下载工程代码. 开发准备 环境要 ...
- Silverlight 2中实现文件上传和电子邮件发送
Silverlight 2中实现文件上传和电子邮件发送 [收藏此页] [打印] 作者:IT168 TerryLee 2008-05-30 内容导航: 使用Web Service上传文件 [I ...
- Javaweb-文件上传和邮件发送
1.文件上传 新建空项目 准备工作 在maven仓库里下载commons io 和 commons fileupload两个jar包 实用类介绍 文件上传注意事项 为保证服务器安全,上传文件应该放在外 ...
- flask完成文件上传功能
在使用flask定义路由完成文件上传时,定义upload视图函数 from flask import Flask, render_template from werkzeug.utils import ...
- Flask入门文件上传flask-uploads(八)
1 视图传递多个参数 (1) 普通传参 : 关键字参数传递 return render_template('模板名称.html',arg1=val1,arg2=val2...) (2) 字典传参 : ...
- Spring Boot—04文件上传
package com.smartmap.sample.ch1.controller.view; import java.io.File; import java.io.IOException; im ...
- AJAX文件上传实践与分析,带HTML5文件上传API。
对于HTML5已经支持AJAX文件上传了,但如果需要兼容的话还是得用一点小技巧的,HTML5等等介绍,先来看看以前我们是怎么写的. 网上可能会有一些叫AJAX文件上传插件,但在AJAX2.0之前是不可 ...
- 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: ...
随机推荐
- ICONIX方法(用例分析方法实例教程)
- Java复习之Eclipse快捷键大全
Ctrl+1 快速修复(最经典的快捷键,就不用多说了)Ctrl+D: 删除当前行 Ctrl+Alt+↓ 复制当前行到下一行(复制增加)Ctrl+Alt+↑ 复制当前行到上一行(复制增加)Alt+↓ 当 ...
- jQuery登录倒计时
<!DOCTYPE html> <html> <head> <meta charset="utf-8"> <script sr ...
- 【阿里云产品公测】小白对OTS两点小建议
作者:阿里云用户荷包蛋 我是大一的新生,作为一个爱技术爱学习爱折腾的熊孩子,我在暑假申请了ECS,学到了很多东西.现在阿里巴巴又开放了很多免费测试,我抱着学习和围观的心态申请了测试,其中有OTS这个高 ...
- Android 自定义Dialog中加EditText弹不出键盘跟Dialog遮挡键盘的问题
先上两张图 第一张问题很明显,第二张是成功的图, 其实第一张是加了 //getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INP ...
- wxpython 界面布局
1.frame.Centre() 窗口出来后显示居中 2.textCtrl文本框style=wx.TE_PASSWORD密码, wx.TE_MULTILINE多行输入 3.单选按钮组 4.列表 5.图 ...
- mac 上配置 maven
1. 将maven压缩包解压至/Users/suqiuhui/Applications目录下的新建文件夹dev下 2. 打开终端(系统根目录,~/下) 3. 如果没有 .bash_profile 文件 ...
- hibernate 性能优化之 1+N 问题
1. 注意 session.clear()的运用,尤其在不断分页查询的时候 a) 在一个大集合中进行遍历,遍历 msg,去除其中的含有敏感字样的对象 b) 另外一种形式的内存泄漏 面试题:Java 有 ...
- 基于 Azure 托管磁盘配置高可用共享文件系统
背景介绍 在当下,共享这个概念融入到了人们的生活中,共享单车,共享宝马,共享床铺等等.其实在 IT 界,共享这个概念很早就出现了,通过 SMB 协议的 Windows 共享目录,NFS 协议的网络文件 ...
- mybatis中sql语句查询操作
动态sql where if where可以自动处理第一个and. <!-- 根据id查询用户信息 --> <!-- public User findUserById(int id) ...