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正则分组的应用
Nov 10 Python
在Python中使用poplib模块收取邮件的教程
Apr 29 Python
在Python的Flask中使用WTForms表单框架的基础教程
Jun 07 Python
打包发布Python模块的方法详解
Sep 18 Python
Python 描述符(Descriptor)入门
Nov 20 Python
对python中矩阵相加函数sum()的使用详解
Jan 28 Python
python实现布隆过滤器及原理解析
Dec 08 Python
Django Serializer HiddenField隐藏字段实例
Mar 31 Python
Python+pyftpdlib实现局域网文件互传
Aug 24 Python
Python存储读取HDF5文件代码解析
Nov 25 Python
selenium+python实现基本自动化测试的示例代码
Jan 27 Python
OpenCV-Python使用cv2实现傅里叶变换
Jun 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如何调用webservice应用介绍
2012/11/24 PHP
thinkphp控制器调度使用示例
2014/02/24 PHP
在php和MySql中计算时间差的方法详解
2015/03/27 PHP
php探针使用原理和技巧讲解
2019/09/17 PHP
图片自动缩小的js代码,用以防止图片撑破页面
2007/03/12 Javascript
javascript 支持链式调用的异步调用框架Async.Operation
2009/08/04 Javascript
Jquery 实现Tab效果 思路是js思路
2010/03/02 Javascript
jQuery 翻牌或百叶窗效果(内容三秒自动切换)
2012/06/14 Javascript
JavaScript实现梯形乘法表的方法
2015/04/25 Javascript
js获取及判断键盘按键的方法
2015/12/01 Javascript
jQuery实现页面下拉100像素出现悬浮窗口的方法
2016/09/05 Javascript
微信公众平台开发教程(四) 实例入门:机器人回复(附源码)
2016/12/02 Javascript
Bootstrap基本插件学习笔记之Popover提示框(19)
2016/12/08 Javascript
javascript replace()第二个参数为函数时的参数用法
2016/12/26 Javascript
微信小程序 rich-text的使用方法
2017/08/04 Javascript
JavaScript数组的5种迭代方法
2017/09/29 Javascript
浅谈vue项目如何打包扔向服务器
2018/05/08 Javascript
微信小程序swiper使用网络图片不显示问题解决
2019/12/13 Javascript
javascript实现简易数码时钟
2020/03/30 Javascript
前端vue+elementUI如何实现记住密码功能
2020/09/20 Javascript
Python中的yield浅析
2014/06/16 Python
python中遍历文件的3个方法
2014/09/02 Python
python3.6 +tkinter GUI编程 实现界面化的文本处理工具(推荐)
2017/12/20 Python
Python中if elif else及缩进的使用简述
2018/05/31 Python
Python求解任意闭区间的所有素数
2018/06/10 Python
Python使用numpy产生正态分布随机数的向量或矩阵操作示例
2018/08/22 Python
Python统计学一数据的概括性度量详解
2020/03/03 Python
python 使用多线程创建一个Buffer缓存器的实现思路
2020/07/02 Python
Smashbox英国官网:美国知名彩妆品牌
2017/11/13 全球购物
幼儿教师自我鉴定
2013/11/02 职场文书
工商管理专业应届生求职信
2013/11/04 职场文书
中学运动会广播稿
2014/01/19 职场文书
广告传媒专业应届生求职信
2014/03/01 职场文书
街道社区活动报告
2015/02/05 职场文书
幼儿园奖惩制度范本
2015/08/05 职场文书
开发微信小程序之WXSS样式教程
2022/04/18 HTML / CSS