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 相关文章推荐
浅谈Python程序与C++程序的联合使用
Apr 07 Python
利用Python脚本在Nginx和uwsgi上部署MoinMoin的教程
May 05 Python
Python类属性与实例属性用法分析
May 09 Python
Python 生成 -1~1 之间的随机数矩阵方法
Aug 04 Python
Python 监测文件是否更新的方法
Jun 10 Python
详解python中的time和datetime的常用方法
Jul 08 Python
django Admin文档生成器使用详解
Jul 22 Python
PIL包中Image模块的convert()函数的具体使用
Feb 26 Python
在python3中使用shuffle函数要注意的地方
Feb 28 Python
Python matplotlib修改默认字体的操作
Mar 05 Python
Python连接HDFS实现文件上传下载及Pandas转换文本文件到CSV操作
Jun 06 Python
pytorch判断是否cuda 判断变量类型方式
Jun 23 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开发工具有哪五款
2015/11/09 PHP
Yii 2.0自带的验证码使用经验分享
2017/06/19 PHP
PHP编程快速实现数组去重的方法详解
2017/07/22 PHP
php生成复杂验证码(倾斜,正弦干扰线,黏贴,旋转)
2018/03/12 PHP
小议Function.apply() 之一------(函数的劫持与对象的复制)
2006/11/30 Javascript
jquery实现可拖动DIV自定义保存到数据的实例
2013/11/20 Javascript
Javascript加载速度慢的解决方案
2014/03/11 Javascript
js实现文本框中输入文字页面中div层同步获取文本框内容的方法
2015/03/03 Javascript
js仿搜狐视频记录片列表展示效果
2020/05/30 Javascript
JS运动特效之任意值添加运动的方法分析
2018/01/24 Javascript
vue将后台数据时间戳转换成日期格式
2019/07/31 Javascript
layui扩展上传组件模拟进度条的方法
2019/09/23 Javascript
vue 关闭浏览器窗口的时候,清空localStorage的数据示例
2019/11/06 Javascript
IDEA配置jQuery, $符号不再显示黄色波浪线的问题
2020/10/09 jQuery
[01:19:23]2018DOTA2亚洲邀请赛 4.5 淘汰赛 Mineski vs VG 第二场
2018/04/06 DOTA
python 根据pid杀死相应进程的方法
2017/01/16 Python
Python实现将照片变成卡通图片的方法【基于opencv】
2018/01/17 Python
Python基于聚类算法实现密度聚类(DBSCAN)计算【测试可用】
2018/12/26 Python
python matplotlib库绘制散点图例题解析
2019/08/10 Python
python爬虫之遍历单个域名
2019/11/20 Python
python找出列表中大于某个阈值的数据段示例
2019/11/24 Python
在Python中预先初始化列表内容和长度的实现
2019/11/28 Python
python读写Excel表格的实例代码(简单实用)
2019/12/19 Python
keras 多gpu并行运行案例
2020/06/10 Python
TensorFlow中如何确定张量的形状实例
2020/06/23 Python
django restframework serializer 增加自定义字段操作
2020/07/15 Python
python 基于selenium实现鼠标拖拽功能
2020/12/24 Python
基于CSS3的animation属性实现微信拍一拍动画效果
2020/06/22 HTML / CSS
html特殊符号示例 html特殊字符编码对照表
2014/01/14 HTML / CSS
canvas离屏技术与放大镜实现代码示例
2018/08/31 HTML / CSS
英国太阳镜品牌:Taylor Morris Eyewear
2018/04/18 全球购物
公司企业表扬信
2014/01/11 职场文书
高效课堂标语
2014/06/26 职场文书
校园主题婚礼活动策划方案
2014/09/15 职场文书
虚拟机linux端mysql数据库无法远程访问的解决办法
2021/05/26 MySQL
十大好看的穿越动漫排名:《瑞克和莫蒂》第一,国漫《有药》在榜
2022/03/18 日漫