flask入门之文件上传与邮件发送示例
时间:2018-07-18
本篇文章主要介绍了flask入门之文件上传与邮件发送示例,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
文件上传邮件发送
一、原生文件上传
form.html
<img src="{{ url_for('static',filename='img/17.jpg') }}" width="300" alt=""> <form action="" method="post" enctype="multipart/form-data"> <p>修改头像 <input type="file" name="file"></p> <p><input type="submit" value="提交"></p> </form>
manage.py
#文件上传的视图函数 @app.route('/upload/',methods=['GET','POST']) def icon(): img_name = None if request.method == 'POST' and 'file' in request.files: # return '有文件上传了' file = request.files.get('file') filename = file.filename #拿到文件名称 #图片上传保存的路径 imgPath = os.path.join(os.getcwd(), 'static/upload/'+filename) file.save(imgPath) img_name = filename return render_template('user/change_icon.html',img_name=img_name)
使用wtf和bootstrap渲染文件上传
from flask import Flask,render_template,request from flask_script import Manager from flask_wtf import FlaskForm from flask_wtf.file import FileField,FileAllowed,FileRequired from wtforms import SubmitField from flask_uploads import UploadSet,patch_request_class,configure_uploads,IMAGES from flask_bootstrap import Bootstrap import os from PIL import Image app = Flask(__name__) app.config['MAX_CONTENT_LENGTH'] = 1024*1024*64 app.config['SECRET_KEY'] = 'abcdef' app.config['UPLOADED_PHOTOS_DEST'] = os.path.join(os.getcwd(),'static/upload') bootstrap = Bootstrap(app) file = UploadSet('photos',IMAGES) configure_uploads(app,file) patch_request_class(app,size=None) manager = Manager(app) #自定义一个文件上传的表单类 class File(FlaskForm): photos = FileField('修改头像',validators=[FileRequired(message='文件不能为空'),FileAllowed(file,message='该文件类型不允许上传')]) submit = SubmitField('提交') @app.route('/') def index(): return render_template('index.html') #生成随机的图片名称 def random_name(suffix,length=32): import string,random myStr = string.ascii_letters + '0123456789' return ''.join(random.choice(myStr) for i in range(length))+suffix @app.route('/upload/',methods=['GET','POST']) def icon(): form = File() img_url = None if form.validate_on_submit(): data = request.files.get('photos') suffix = os.path.splitext(data.filename)[-1] newName = random_name(suffix) file.save(data,name=newName) img_url = file.url(newName) img = Image.open(os.path.join(app.config['UPLOADED_PHOTOS_DEST'],newName)) print(img.size) # 获取图片大小 # 设置尺寸 img.thumbnail((128, 128)) # 当前缩放不是等比缩放 变成等比缩放 img.save(os.path.join(app.config['UPLOADED_PHOTOS_DEST'],'s_'+newName)) return render_template('user/wtf-uplods.html',form=form,img_url=img_url) if __name__ == '__main__': manager.run()
模板中的代码
from flask import Flask,render_template,request from flask_script import Manager from flask_wtf import FlaskForm from flask_wtf.file import FileField,FileAllowed,FileRequired from wtforms import SubmitField from flask_uploads import UploadSet,patch_request_class,configure_uploads,IMAGES from flask_bootstrap import Bootstrap import os from PIL import Image app = Flask(__name__) app.config['MAX_CONTENT_LENGTH'] = 1024*1024*64 app.config['SECRET_KEY'] = 'abcdef' app.config['UPLOADED_PHOTOS_DEST'] = os.path.join(os.getcwd(),'static/upload') bootstrap = Bootstrap(app) file = UploadSet('photos',IMAGES) configure_uploads(app,file) patch_request_class(app,size=None) manager = Manager(app) #自定义一个文件上传的表单类 class File(FlaskForm): photos = FileField('修改头像',validators=[FileRequired(message='文件不能为空'),FileAllowed(file,message='该文件类型不允许上传')]) submit = SubmitField('提交') @app.route('/') def index(): return render_template('index.html') #生成随机的图片名称 def random_name(suffix,length=32): import string,random myStr = string.ascii_letters + '0123456789' return ''.join(random.choice(myStr) for i in range(length))+suffix @app.route('/upload/',methods=['GET','POST']) def icon(): form = File() img_url = None if form.validate_on_submit(): data = request.files.get('photos') suffix = os.path.splitext(data.filename)[-1] newName = random_name(suffix) file.save(data,name=newName) img_url = file.url(newName) img = Image.open(os.path.join(app.config['UPLOADED_PHOTOS_DEST'],newName)) print(img.size) # 获取图片大小 # 设置尺寸 img.thumbnail((128, 128)) # 当前缩放不是等比缩放 变成等比缩放 img.save(os.path.join(app.config['UPLOADED_PHOTOS_DEST'],'s_'+newName)) return render_template('user/wtf-uplods.html',form=form,img_url=img_url) if __name__ == '__main__': manager.run()
二、发送邮件 flask-mail
pip install flask-mail
设置临时环境变量
windows set 名=值
Ubuntu下 export 名=值
注意: 名和值都不用加引号
单线程发送邮件
from flask import Flask,render_template from flask_script import Manager from flask_mail import Mail,Message import os app = Flask(__name__) app.config['MAIL_SERVER'] = 'smtp.163.com' # 为了保密 将邮箱账号和授权码都加入到了临时环境变量中 app.config['MAIL_USERNAME'] = os.environ.get('MAIL_USERNAME') app.config['MAIL_PASSWORD'] = os.environ.get('MAIL_PASSWORD') mail = Mail(app) manager = Manager(app) @app.route('/send_mail/') def send_mail(): msg = Message(subject='大郎',recipients=['793390457@qq.com'],sender=app.config['MAIL_USERNAME']) msg.html = render_template('email/activate.html',username='大郎') mail.send(message=msg) return '发送邮件' if __name__ == '__main__': manager.run()
异步发送邮件
from flask import Flask,render_template from flask_script import Manager from flask_mail import Mail,Message import os from threading import Thread app = Flask(__name__) app.config['MAIL_SERVER'] = 'smtp.163.com' app.config['MAIL_USERNAME'] = os.environ.get('MAIL_USERNAME') app.config['MAIL_PASSWORD'] = os.environ.get('MAIL_PASSWORD') mail = Mail(app) manager = Manager(app) @app.route('/send_mail/') def send_mail(): msg = Message(subject='大郎',recipients=['793390457@qq.com'],sender=app.config['MAIL_USERNAME']) msg.html = render_template('email/activate.html',username='大郎') thr = Thread(target=async_send_mail,args=(msg,)) #创建线程 参数1为创建子线程 参数2为传递参数 类型为元组 thr.start() #开启线程 return '发送邮件' def async_send_mail(msg): #开启程序上下文 把当前请求 作为同一个请求 with app.app_context(): mail.send(message=msg) if __name__ == '__main__': manager.run()
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持脚本之家。
- History API与浏览器历史堆栈管理
- node中创建服务进程
- 数据挖掘工程师:如何通过百度地图API抓取建筑物周边位置、房价信息
- crontab导致CPU异常的问题分析及处理(r3笔记第100天)
- 短信接口被恶意调用(二)肉搏战-阻止恶意请求
- 关于首屏时间采集自动化的解决方案
- javax.net.ssl.SSLHandshakeException: No appropriate protocol (protocol is disabled or cipher suites
- 一次数据库无法登陆的问题及排查 (r3笔记第99天)
- 用深度学习keras的cnn做图像识别分类,准确率达97%
- 短信发送接口被恶意访问的网络攻击事件(三)定位恶意IP的日志分析脚本
- job处理缓慢的性能问题排查与分析(r4笔记第18天)
- 京东商品评论情感分析:数据采集与词向量构造方法
- springboot开启access_log日志输出
- 完美的执行计划导致的性能问题(r4笔记第17天)
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法