Flask框架教程汇总(4)---其中有原生文件上传+uploads+ mail 等

本文介绍如何在Flask应用中实现文件上传功能及邮件发送功能,包括原生文件上传处理、使用flask-uploads简化文件上传流程,以及利用flask-mail实现邮件发送。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

本节目录:
1 原生文件上传
2 flask-uploads
3 flask-mail 邮件发送

本教程的flask环境都是在ubuntu 16.04下 —python3.5—IDE为pycharm 如果有任何问题可以留言哦 !


一、原生文件上传

模板文件

    {% if newName %}
        <img src="{{ url_for('static',filename=newName) }}" alt="">
    {% endif %}
    <form action="{{ url_for('upload') }}" enctype="multipart/form-data" method="post">
        <input type="file" name="file">
        <p><input type="submit" value="submit"></p>
    </form>

manage.py 文件中

    from flask import Flask,render_template,request
    from flask_script import Manager
    from flask_bootstrap import Bootstrap
    import os
    from PIL import Image
    #pip3 install pillow  #图片处理库

    app = Flask(__name__)
    #允许上传的后缀
    app.config['ALLOWED_EXTENSIONS'] = ['.jpg','.jpeg','.png','.gif']
    #上传的大小
    app.config['MAX_CONTENT_LENGTH'] = 1024*1024*64 #64兆
    #配置文件上传的路径
    app.config['UPLOAD_FOLDER'] = os.getcwd()+'/static'

    bootstrap = Bootstrap(app)
    manager = Manager(app)

    @app.route('/')
    def index():
        return render_template('index.html')

    #生成随机图片名称的函数
    def new_name(shuffix,length=32):
        import string, random
        myStr = string.ascii_letters + '0123456789'
        newName = ''.join(random.choice(myStr) for i in range(length))
        return newName+shuffix

    def allowed_file(shuffix):
        return shuffix in app.config['ALLOWED_EXTENSIONS']

    # 处理
    #1 获取后缀 判断是否所允许
    #2 设置上传大小
    #3 生成随机的图片名称
    @app.route('/upload',methods=['GET','POST'])
    def upload():
        img_name = None
        if request.method == 'POST':
            # print(request.files)
            file = request.files.get('file') #拿到文件对象
            filename = file.filename #获取上传的图片名称
            shuffix = os.path.splitext(filename)[-1]
            #获取到名称的后缀
            #为真 则继续处理
            if allowed_file(shuffix):
                #调用生成随机图片名称的函数
                while True:
                    newName = new_name(shuffix)
                    newPath = os.path.join(app.config['UPLOAD_FOLDER'],newName)
                    if not os.path.exists(newPath)
                    break
                img_name = newName
                #拼凑完整的图片上传路径
                file.save(newPath) #保存图片

                #处理图片的缩放
                img = Image.open(newPath)
                print(img.size)
                #重新设置大小和尺寸
                img.thumbnail((200,200))
                #等比例缩放, 第一个数确定后, 会自动按照比例和第一个数进行缩放, 第二个数其实控制不了大小
                #400 200
                #200 300
                #200 100
                img.save(newPath)
            # return '上传成功 名称为{}'.format(newName)
        return render_template('upload.html',newName=img_name)

二、flask-uploads

文件上传的第三方模块

pip3 install flask-uploads

导入

from flask_uploads import UploadSet,IMAGES,configure_uploads,patch_request_class

完整

    from flask import Flask,render_template,request
    from flask_script import Manager
    from flask_bootstrap import Bootstrap
    import os
    from flask_uploads import UploadSet,IMAGES,configure_uploads,patch_request_class
    from flask_wtf import FlaskForm
    from wtforms import FileField,SubmitField
    from flask_wtf.file import FileAllowed,FileRequired

    app = Flask(__name__)
    #允许上传的后缀
    app.config['SECRET_KEY'] = 'image'
    app.config['MAX_CONTENT_LENGTH'] = 1024*1024*64 #64兆
    #配置文件上传的路径
    app.config['UPLOADED_PHOTOS_DEST'] = os.getcwd()+'/static/upload'

    file = UploadSet('photos',IMAGES)
    configure_uploads(app,file)
    patch_request_class(app,size=None)


    bootstrap = Bootstrap(app)
    manager = Manager(app)

    class File(FlaskForm):
        file = FileField('文件上传',validators=[FileRequired(message='您还没有选择文件'),FileAllowed(file,message='只能上擦图片')])
        submit = SubmitField('上传')

    #生成随机图片名称的函数
    def new_name(shuffix,length=32):
        import string, random
        myStr = string.ascii_letters + '0123456789'
        newName = ''.join(random.choice(myStr) for i in range(length))
        return newName+shuffix

    @app.route('/upload',methods=['GET','POST'])
    def upload():
        form = File()
        img_url = None
        # if request.method == 'POST' and 'file' in request.files:
        if form.validate_on_submit():
            shuffix = os.path.splitext(form.file.data.filename)[-1]
            newName = new_name(shuffix=shuffix)
            file.save(form.file.data,name=newName)
            img_url = file.url(newName)
        return  render_template('boot_upload.html',newName=img_url,form=form)

    if __name__ == '__main__':
        manager.run()

三、flask-mail 邮件发送

安装

pip3 install flask-mail

    from flask import Flask,render_template_string
    from flask_mail import Mail,Message
    import os

    app = Flask(__name__)

    app.config['MAIL_SERVER'] = os.environ.get('MAIL_SERVER','这儿写邮箱的SMTP服务器: 例如:smtp.163.com')

    app.config['MAIL_USERNAME'] = os.environ.get('MAIL_USERNAME','自己邮箱的登录账户')

    app.config['MAIL_PASSWORD'] = os.environ.get('MAIL_PASSWORD','这儿是邮箱授权码, 不是登录密码')
    mail = Mail(app)

    @app.route('/')
    def index():
        msg = Message(subject='邮件激活',recipients=['发件人邮箱地址,和上边那个一致'],sender=app.config['MAIL_USERNAME'])
        msg.html = render_template_string('<h2>大郎啊 我是金莲</h2>')
        mail.send(message=msg)
        return '发送邮件'

    if __name__ == '__main__':
        app.run(debug=True)

使用线程异步发送邮件 避免用户在等待(也就是防止当前页面没有很快响应的问题)

    from flask import Flask,render_template_string,render_template
    from flask_mail import Mail,Message
    import os
    from threading import Thread

    app = Flask(__name__)

    app.config['MAIL_SERVER'] = os.environ.get('MAIL_SERVER','这儿写邮箱的SMTP服务器: 例如:smtp.163.com
')
    app.config['MAIL_USERNAME'] = os.environ.get('MAIL_USERNAME','自己邮箱的登录账户')
    app.config['MAIL_PASSWORD'] = os.environ.get('MAIL_PASSWORD','这儿是邮箱授权码, 不是登录密码')
    mail = Mail(app)
    #异步发送邮件
    def async_send_mail(app,msg):
        #获取当前程序的上下文
        with app.app_context():
            mail.send(message=msg)

    def send_mail(subject,to,tem,**kwargs):
        msg = Message(subject=subject, recipients=[to], sender=app.config['MAIL_USERNAME'])
        msg.html = render_template(tem+'.html',**kwargs)
        send = Thread(target=async_send_mail,args=(app,msg))
        send.start()

    @app.route('/')
    def index():
        send_mail('邮件激活','发件人邮箱地址,和上边那个一致','mail',username='zhangsan')
        return '发送邮件'

    if __name__ == '__main__':
        app.run(debug=True)

技术交流可以留言评论哦 ! 虚心学习, 不忘初心, 共同奋进 !

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值