flask入门之文件上传与邮件发送示例


Posted in Python onJuly 18, 2018

文件上传邮件发送

一、原生文件上传

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()

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Python 相关文章推荐
解决windows下Sublime Text 2 运行 PyQt 不显示的方法分享
Jun 18 Python
Python调用C语言开发的共享库方法实例
Mar 18 Python
Python2.x与Python3.x的区别
Jan 14 Python
web.py 十分钟创建简易博客实现代码
Apr 22 Python
python获取酷狗音乐top500的下载地址 MP3格式
Apr 17 Python
Python打开文件,将list、numpy数组内容写入txt文件中的方法
Oct 26 Python
[原创]Python入门教程4. 元组基本操作
Oct 31 Python
python实现五子棋游戏
Jun 18 Python
django-rest-swagger的优化使用方法
Aug 29 Python
将python字符串转化成长表达式的函数eval实例
May 11 Python
opencv+pyQt5实现图片阈值编辑器/寻色块阈值利器
Nov 13 Python
一行代码python实现文件共享服务器
Apr 22 Python
Sanic框架流式传输操作示例
Jul 18 #Python
django 发送邮件和缓存的实现代码
Jul 18 #Python
python实现linux下抓包并存库功能
Jul 18 #Python
python调用tcpdump抓包过滤的方法
Jul 18 #Python
Python使用Selenium模块模拟浏览器抓取斗鱼直播间信息示例
Jul 18 #Python
解决Python3中的中文字符编码的问题
Jul 18 #Python
Python使用Selenium模块实现模拟浏览器抓取淘宝商品美食信息功能示例
Jul 18 #Python
You might like
php中用加号与用array_merge合并数组的区别深入分析
2013/06/03 PHP
php防注入,表单提交值转义的实现详解
2013/06/10 PHP
php自定义hash函数实例
2015/05/05 PHP
PHP中file_put_contents追加和换行的实现方法
2017/04/01 PHP
php数据结构之顺序链表与链式线性表示例
2018/01/22 PHP
PHP实现可精确验证身份证号码的工具类示例
2018/05/31 PHP
PHP发送邮件确认验证注册功能示例【修改别人邮件类】
2019/11/09 PHP
JavaScript 学习笔记一些小技巧
2010/03/28 Javascript
使用jQuery轻松实现Ajax的实例代码
2010/08/16 Javascript
jquery获取元素值的方法(常见的表单元素)
2013/11/15 Javascript
JavaScript获取路径设计源码
2014/05/22 Javascript
jquery实现简单文字提示效果
2015/12/02 Javascript
node.js微信公众平台开发教程
2016/03/04 Javascript
基于JavaScript实现前端数据多条件筛选功能
2020/08/19 Javascript
基于JavaScript canvas绘制贝塞尔曲线
2018/12/25 Javascript
vue项目创建并引入饿了么elementUI组件的步骤
2019/04/11 Javascript
vue+mock.js实现前后端分离
2019/07/24 Javascript
手把手带你搭建一个node cli的方法示例
2020/08/07 Javascript
vue使用echarts画组织结构图
2021/02/06 Vue.js
[01:52]PWL S2开团时刻第四期——DOTA2成语故事
2020/12/03 DOTA
python多重继承实例
2014/10/11 Python
pytorch 模型可视化的例子
2019/08/17 Python
Python 多线程搜索txt文件的内容,并写入搜到的内容(Lock)方法
2019/08/23 Python
详解tensorflow之过拟合问题实战
2020/11/01 Python
施华洛世奇澳大利亚官网:SWAROVSKI澳大利亚
2017/01/06 全球购物
美国Randolph太阳镜官网:美国制造的飞行员太阳镜和射击眼镜
2018/06/15 全球购物
什么是静态路由,其特点是什么?什么是动态路由,其特点是什么?
2013/07/26 面试题
华为python面试题
2016/05/03 面试题
教学评估实施方案
2014/03/16 职场文书
学校搬迁方案
2014/06/15 职场文书
投标授权委托书范文
2014/08/02 职场文书
2014年公司工作总结
2014/11/22 职场文书
食品药品安全责任书
2015/05/11 职场文书
观后感格式
2015/06/19 职场文书
2015年第31个教师节致辞
2015/07/31 职场文书
windows安装python超详细图文教程
2021/05/21 Python