文件上传与邮件发送

  • 可以按照标题分别直接粘贴对应的文件夹,运行直接用:

    原生上传

  • 模板文件

    1. <form method="post" enctype="multipart/form-data">
    2. <input type="file" name="photo" /><br />
    3. <input type="submit" value="上传" />
    4. </form>
  • 视图函数

    1. @app.route('/upload/', methods=['GET', 'POST'])
    2. def upload():
    3. if request.method == 'POST':
    4. # 获取上传对象
    5. photo = request.files.get('photo')
    6. if photo:
    7. # 保存上传文件,参数是文件保存的路径名
    8. photo.save(photo.filename)
    9. return '文件上传成功'
    10. return '文件上传失败'
    11. return render_template('upload.html')
  • 优化完善

    1. import os
    2. from flask import send_from_directory
    3. # 上传文件保存位置
    4. app.config['UPLOADED_FOLDER'] = os.path.join(os.getcwd(), 'static/upload')
    5. # 请求大小(文件大小限制)
    6. app.config['MAX_CONTENT_LENGTH'] = 1024 * 1024 * 8
    7. # 判断是否是允许的文件类型
    8. def allowed_file(filename):
    9. return '.' in filename and filename.rsplit('.', 1)[1] in ALLOWED_SUFFIX
    10. # 展示上传的文件
    11. @app.route('/uploaded/<filename>')
    12. def upladed(filename):
    13. # 安全的发送文件
    14. return send_from_directory(app.config['UPLOADED_FOLDER'], filename)
    15. @app.route('/upload/', methods=['GET', 'POST'])
    16. def upload():
    17. img_url = None
    18. if request.method == 'POST':
    19. # 获取上传对象
    20. photo = request.files.get('photo')
    21. # 保存前验证文件的类型
    22. if photo and allowed_file(photo.filename):
    23. # 拼接文件保存的完整路径名
    24. pathname = os.path.join(app.config['UPLOADED_FOLDER'],
    25. photo.filename)
    26. # 保存上传文件,参数是文件保存的路径名
    27. photo.save(pathname)
    28. img_url = url_for('upladed', filename=photo.filename)
    29. return render_template('upload.html', img_url=img_url)

    优化:大小限定、类型限定、保存位置、查看上传文件

flask-uploads

  • 说明:极大地优化了文件上传的操作,使用非常方便

  • 安装:pip install flask-uploads

  • 使用:

    • 配置
    1. from flask_uploads import UploadSet, IMAGES
    2. from flask_uploads import configure_uploads
    3. from flask_uploads import patch_request_class
    4. import os
    5. app = Flask(__name__)
    6. # 设置文件的大小:8M=8*1024*1024k
    7. app.config['MAX_CONTENT_LENGTH'] = 1024 * 1024 * 8
    8. app.config['UPLOADED_PHOTOS_DEST'] = os.path.join(os.getcwd(), 'static/upload')
    9. # 创建上传对象,指定名字和上传文件的类型
    10. photos = UploadSet('photos', IMAGES)
    11. # 配置上传对象
    12. configure_uploads(app, photos)
    13. # 设置上传文件大小,默认64M,设置为None,大小由MAX_CONTENT_LENGTH决定
    14. patch_request_class(app, size=None)
    • 视图函数
    1. @app.route('/upload/', methods=['GET', 'POST'])
    2. def upload():
    3. img_url = None
    4. if request.method == 'POST':
    5. # 获取上传对象
    6. photo = request.files.get('photo')
    7. if photo:
    8. # 保存上传文件
    9. photos.save(photo)
    10. # 获取上传文件的地址
    11. img_url = photos.url(photo.filename)
    12. return render_template('upload.html', img_url=img_url)
    • 优化上传:生成随机文件名,生成缩略图(PIL模块,只支持py2,py3中使用需要安装pillow)
    1. # 生成随机字符串
    2. def random_string(length=32):
    3. import random
    4. base_str = 'abcdefghijklmnopqrstuvwxyz1234567890'
    5. return ''.join(random.choice(base_str) for i in range(length))
    6. @app.route('/upload/', methods=['GET', 'POST'])
    7. def upload():
    8. img_url = None
    9. if request.method == 'POST':
    10. # 获取上传对象
    11. photo = request.files.get('photo')
    12. if photo:
    13. # 提取文件后缀
    14. suffix = os.path.splitext(photo.filename)[1]
    15. # 生成随机文件名
    16. filename = random_string() + suffix
    17. # 保存上传文件
    18. photos.save(photo, name=filename)
    19. # 生成缩略图
    20. from PIL import Image
    21. # 拼接完整路径名
    22. pathname = os.path.join(app.config['UPLOADED_PHOTOS_DEST'], filename)
    23. # 打开文件
    24. img = Image.open(pathname)
    25. # 设置大小
    26. img.thumbnail((64, 64))
    27. # 保存修改后的图片
    28. img.save(pathname)
    29. # 获取上传文件的地址
    30. img_url = photos.url(filename)
    31. return render_template('upload.html', img_url=img_url)

综合使用

  • 要求:结合flask-bootstrap、flask-wtf、flask-uploads等实现文件上传
  • 使用:
    • 各种配置及对象创建
    • 注意对象创建的先后顺序
    • 上传文件的校验处理过程与上面一样

flask-mail

  • 说明:专门用来实现邮件发送的扩展库,使用非常方便。

  • 安装:pip install flask-mail

  • 使用:

    1. from flask_mail import Mail, Message
    2. import os
    3. # 邮件配置,一定要放在对象创建之前
    4. # 邮箱服务器:不同类型邮箱服务器不同,不知道的请百度
    5. app.config['MAIL_SERVER'] = 'smtp.xxx.com'
    6. # 用户名
    7. app.config['MAIL_USERNAME'] = 'xxx@xxx.com'
    8. # 密码:如果密码添加到了环境变量可以直接引用'MAIL_PASSWORD',否则直接把'123456'换成自己的邮箱密码。
    9. app.config['MAIL_PASSWORD'] = os.getenv('MAIL_PASSWORD', '123456')
    10. # 创建发送邮件的对象
    11. mail = Mail(app)
    12. @app.route('/send/')
    13. def send():
    14. # 创建邮件消息对象
    15. msg = Message('账户激活',
    16. recipients=['xxx@qq.com'],
    17. sender=app.config['MAIL_USERNAME'])
    18. # 设置邮件内容
    19. msg.html = '恭喜你,中奖了!'
    20. # 发送邮件
    21. mail.send(msg)
    22. return '邮件发送成功'
  • 总结:

    • 书写邮箱相关配置
    • 创建发送邮件的(Mail)对象
    • 创建邮件消息(Message)对象
    • 使用mail的send方法发送邮件
  • 封装函数发送邮件

    1. # 封装函数发送邮件
    2. def send_mail(subject, to, template, **kwargs):
    3. # 处理邮件接收者
    4. if isinstance(to, list):
    5. recipients = to
    6. elif isinstance(to, str):
    7. recipients = to.split(',')
    8. else:
    9. raise Exception('邮件接收者参数有误')
    10. # 创建邮件消息对象
    11. msg = Message(subject=subject, recipients=recipients,
    12. sender=app.config['MAIL_USERNAME'])
    13. # 设置邮件内容
    14. msg.html = render_template(template, **kwargs)
    15. # 发送邮件
    16. mail.send(msg)
    17. @app.route('/send/')
    18. def send():
    19. # 调用函数即可发送邮件
    20. send_mail('账户激活', 'xxx@qq.com', 'activate.html', name='八戒')
    21. return '邮件发送成功'
  • 异步发送邮件

    1. from flask import current_app
    2. from threading import Thread
    3. # 异步发送邮件
    4. def async_send_mail(app, msg):
    5. # 邮件发送必须在程序上下文中进行
    6. # 新的线程没有上下文,因此需要手动创建上下文
    7. with app.app_context():
    8. mail.send(msg)
    9. # 封装函数发送邮件
    10. def send_mail(subject, to, template, **kwargs):
    11. # 处理邮件接收者
    12. if isinstance(to, list):
    13. recipients = to
    14. elif isinstance(to, str):
    15. recipients = to.split(',')
    16. else:
    17. raise Exception('邮件接收者参数有误')
    18. # 从代理中获取原始对象
    19. app = current_app._get_current_object()
    20. # 创建邮件消息对象
    21. msg = Message(subject=subject,recipients=recipients,sender=app.config['MAIL_USERNAME'])
    22. # 设置邮件内容
    23. msg.html = render_template(template, **kwargs)
    24. # 发送邮件:同步发送,会阻塞运行
    25. # mail.send(msg)
    26. # 创建一个线程,在新的线程中发送邮件
    27. thr = Thread(target=async_send_mail, args=(app, msg))
    28. # 启动线程
    29. thr.start()
    30. # 返回线程
    31. return thr
  • QQ邮箱发送配置

    1. # 密码,QQ邮箱需要使用授权码
    2. app.config['MAIL_PASSWORD'] = os.getenv('MAIL_PASSWORD', '123456')
    3. # QQ邮箱配置
    4. # app.config['MAIL_PORT'] = 465
    5. # 加密传输
    6. # app.config['MAIL_USE_SSL'] = True

Flask—04-文件上传与邮件发送(自带优化)的更多相关文章

  1. SpringBoot项目实现文件上传和邮件发送

    前言 本篇文章主要介绍的是SpringBoot项目实现文件上传和邮件发送的功能. SpringBoot 文件上传 说明:如果想直接获取工程那么可以直接跳到底部,通过链接下载工程代码. 开发准备 环境要 ...

  2. Silverlight 2中实现文件上传和电子邮件发送

    Silverlight 2中实现文件上传和电子邮件发送 [收藏此页] [打印]   作者:IT168 TerryLee  2008-05-30 内容导航: 使用Web Service上传文件   [I ...

  3. Javaweb-文件上传和邮件发送

    1.文件上传 新建空项目 准备工作 在maven仓库里下载commons io 和 commons fileupload两个jar包 实用类介绍 文件上传注意事项 为保证服务器安全,上传文件应该放在外 ...

  4. flask完成文件上传功能

    在使用flask定义路由完成文件上传时,定义upload视图函数 from flask import Flask, render_template from werkzeug.utils import ...

  5. Flask入门文件上传flask-uploads(八)

    1 视图传递多个参数 (1) 普通传参 : 关键字参数传递 return render_template('模板名称.html',arg1=val1,arg2=val2...) (2) 字典传参 : ...

  6. Spring Boot—04文件上传

    package com.smartmap.sample.ch1.controller.view; import java.io.File; import java.io.IOException; im ...

  7. AJAX文件上传实践与分析,带HTML5文件上传API。

    对于HTML5已经支持AJAX文件上传了,但如果需要兼容的话还是得用一点小技巧的,HTML5等等介绍,先来看看以前我们是怎么写的. 网上可能会有一些叫AJAX文件上传插件,但在AJAX2.0之前是不可 ...

  8. flask的文件上传和下载

    http://flask.pocoo.org/docs/1.0/api/ http://docs.jinkan.org/docs/flask/api.html?highlight=download h ...

  9. Flask插件wtforms、Flask文件上传和Echarts柱状图

    一.wtforms 类比Django的Form组件Form组件的主要应用是帮助我们自动生成HTML代码和做一些表单数据的验证 flask的wtforms用法跟Form组件大同小异参考文章:https: ...

随机推荐

  1. [转]ASP.NET Core / MVC 6 HttpContext.Current

    本文转自:http://www.spaprogrammer.com/2015/07/mvc-6-httpcontextcurrent.html As you know with MVC 6, Http ...

  2. java ReentrantLock Condition

    sychronized.wait.notify.notifyAll.sleep 在多线程环境下,为了防止多个线程同时调用同一个方法.修改同一份变量,造成数据读取结果混乱,可以使用synchronize ...

  3. 文章点赞功能(Ajax)

    一.文章点赞样式构建 1.将base.html的css样式改为外部引入 将base.html的内嵌样式删除,改为使用 HTML 头部的 <head> 标签对中使用<link>标 ...

  4. 【IOS】Mac和IOS开发资源汇总

    本文主要汇集一些苹果开发的资源,会经常更新,建议大家把这篇文章单独收藏(在浏览器中按**command+D**). 今天收录了许多中文网站和博客.大家一定要去感受一下哦. 如果大家有知道不错的站点,可 ...

  5. Flume的load-balance、failover

    配置flume集群参考https://www.cnblogs.com/jifengblog/p/9277793.html load-balance负载均衡 介绍 负载均衡是用于解决一台机器(一个进程) ...

  6. sql server 某列去重

    例如:某个表中,插入了两条除id外其他字段都一样的数据,但是查询的时候只想查到一条. select * from 表名 where 主键 in ( select max(主键) from 表名 gro ...

  7. laravel 接入蚂蚁金服SDK(以支付宝APP支付为例)开发步骤

    一.创建应用及配置 首先需要到蚂蚁金服开放平台(https://docs.open.alipay.com)注册应用,获取应用id(APP_ID),并且配置应用,主要是签约应用,这个需要审核,一般2-5 ...

  8. GitLab 数据备份和恢复

    GitLab 备份 /opt/gitlab/bin/gitlab-rake gitlab:backup:create //只是备份各项目的数据 完成后会在默认路径下多出来备份的tar包! /var/o ...

  9. Cloud Foundry Session Affinity(Sticky Session)的实现

    会话保持(Session Affinity),有时又称粘滞会话(Sticky Sessions), 是负载均衡领域设计需要着力解决的重要问题之一,也是一个相对比较复杂的问题. 会话保持是指在负载均衡器 ...

  10. Python:运算与循环

    1.格式化输出 name = input("请输入你的名字:") age =input("请输入你的年龄:") job =input("请输入你的工作 ...