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 list使用示例 list中找连续的数字
Jan 27 Python
安装Python和pygame及相应的环境变量配置(图文教程)
Jun 04 Python
windows下python安装paramiko模块和pycrypto模块(简单三步)
Jul 06 Python
Python 查找list中的某个元素的所有的下标方法
Jun 27 Python
Python将json文件写入ES数据库的方法
Apr 10 Python
python实现动态创建类的方法分析
Jun 25 Python
Mac在python3环境下安装virtualwrapper遇到的问题及解决方法
Jul 09 Python
Python数据处理篇之Sympy系列(五)---解方程
Oct 12 Python
pytorch::Dataloader中的迭代器和生成器应用详解
Jan 03 Python
Python netmiko模块的使用
Feb 14 Python
Python能做什么
Jun 02 Python
Python尾递归优化实现代码及原理详解
Oct 09 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 实例化类的一点摘记
2008/03/23 PHP
深入解析php中的foreach问题
2013/06/30 PHP
PHP+Mysql+Ajax实现淘宝客服或阿里旺旺聊天功能(前台页面)
2017/06/16 PHP
PHP实现简单注册登录系统
2020/12/28 PHP
表格单元格交错着色实现思路及代码
2013/04/01 Javascript
用json方式实现在 js 中建立一个map
2014/05/02 Javascript
JavaScript函数详解
2015/02/27 Javascript
jquery中map函数遍历数组用法实例
2015/05/18 Javascript
jquery不常用方法汇总
2015/07/26 Javascript
JS拖拽组件学习使用
2016/01/19 Javascript
基于bootstrap风格的弹框插件
2016/12/28 Javascript
js自定义弹框插件的封装
2020/08/24 Javascript
js实现移动端导航点击自动滑动效果
2017/07/18 Javascript
bootstrap modal+gridview实现弹出框效果
2017/08/15 Javascript
webpack-dev-server远程访问配置方法
2018/02/22 Javascript
小程序如何定位所在城市及发起周边搜索
2020/02/11 Javascript
JavaScript实现放大镜效果代码示例
2020/04/29 Javascript
bootstrap实现tab选项卡切换
2020/08/09 Javascript
[51:00]Secret vs VGJ.S 2018国际邀请赛淘汰赛BO3 第一场 8.24
2018/08/25 DOTA
python每隔N秒运行指定函数的方法
2015/03/16 Python
浅析Python编写函数装饰器
2016/03/18 Python
python实现逻辑回归的方法示例
2017/05/02 Python
Python使用三种方法实现PCA算法
2017/12/12 Python
一篇文章读懂Python赋值与拷贝
2018/04/19 Python
解决PyCharm import torch包失败的问题
2018/10/13 Python
python3.4控制用户输入与输出的方法
2018/10/17 Python
使用50行Python代码从零开始实现一个AI平衡小游戏
2018/11/21 Python
python分布式编程实现过程解析
2019/11/08 Python
Python unittest单元测试框架实现参数化
2020/04/29 Python
python时间序列数据转为timestamp格式的方法
2020/08/03 Python
校园招聘策划书
2014/01/09 职场文书
2014镇党委书记党建工作汇报材料
2014/11/02 职场文书
2014年反洗钱工作总结
2014/11/22 职场文书
2015年事业单位工作总结
2015/04/27 职场文书
商场圣诞节活动总结
2015/05/06 职场文书
2015团员个人年度总结
2015/11/24 职场文书