flask入門之文件上傳與郵件發(fā)送示例
文件上傳郵件發(fā)送
一、原生文件上傳
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
#文件上傳的視圖函數(shù)
@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)
#自定義一個(gè)文件上傳的表單類
class File(FlaskForm):
photos = FileField('修改頭像',validators=[FileRequired(message='文件不能為空'),FileAllowed(file,message='該文件類型不允許上傳')])
submit = SubmitField('提交')
@app.route('/')
def index():
return render_template('index.html')
#生成隨機(jī)的圖片名稱
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) # 獲取圖片大小
# 設(shè)置尺寸
img.thumbnail((128, 128)) # 當(dāng)前縮放不是等比縮放 變成等比縮放
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)
#自定義一個(gè)文件上傳的表單類
class File(FlaskForm):
photos = FileField('修改頭像',validators=[FileRequired(message='文件不能為空'),FileAllowed(file,message='該文件類型不允許上傳')])
submit = SubmitField('提交')
@app.route('/')
def index():
return render_template('index.html')
#生成隨機(jī)的圖片名稱
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) # 獲取圖片大小
# 設(shè)置尺寸
img.thumbnail((128, 128)) # 當(dāng)前縮放不是等比縮放 變成等比縮放
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()
二、發(fā)送郵件 flask-mail
pip install flask-mail
設(shè)置臨時(shí)環(huán)境變量
windows set 名=值
Ubuntu下 export 名=值
注意: 名和值都不用加引號(hào)
單線程發(fā)送郵件
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'
# 為了保密 將郵箱賬號(hào)和授權(quán)碼都加入到了臨時(shí)環(huán)境變量中
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 '發(fā)送郵件'
if __name__ == '__main__':
manager.run()
異步發(fā)送郵件
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,)) #創(chuàng)建線程 參數(shù)1為創(chuàng)建子線程 參數(shù)2為傳遞參數(shù) 類型為元組
thr.start() #開啟線程
return '發(fā)送郵件'
def async_send_mail(msg):
#開啟程序上下文 把當(dāng)前請(qǐng)求 作為同一個(gè)請(qǐng)求
with app.app_context():
mail.send(message=msg)
if __name__ == '__main__':
manager.run()
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
基于Python實(shí)現(xiàn)虛假評(píng)論檢測(cè)可視化系統(tǒng)
這篇文章主要為大家詳細(xì)介紹了如何基于Python實(shí)現(xiàn)一個(gè)簡(jiǎn)單的虛假評(píng)論檢測(cè)可視化系統(tǒng),文中的示例代碼講解詳細(xì),感興趣的小伙伴可以了解一下2023-04-04
Python 解決中文寫入Excel時(shí)拋異常的問題
下面小編就為大家分享一篇Python 解決中文寫入Excel時(shí)拋異常的問題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2018-05-05
Python數(shù)據(jù)結(jié)構(gòu)之循環(huán)鏈表詳解
循環(huán)鏈表 (Circular Linked List) 是鏈?zhǔn)酱鎯?chǔ)結(jié)構(gòu)的另一種形式,它將鏈表中最后一個(gè)結(jié)點(diǎn)的指針指向鏈表的頭結(jié)點(diǎn),使整個(gè)鏈表頭尾相接形成一個(gè)環(huán)形,使鏈表的操作更加方便靈活。本文將詳細(xì)介紹一下循環(huán)鏈表的相關(guān)知識(shí),需要的可以參考一下2022-01-01
OpenCV2.3.1+Python2.7.3+Numpy等的配置解析
這篇文章主要介紹了OpenCV2.3.1+Python2.7.3+Numpy等的配置解析,具有一定借鑒價(jià)值,需要的朋友可以參考下2018-01-01
Python中協(xié)程coroutine適用場(chǎng)景分析
多線程中可能出現(xiàn)多個(gè)線程爭(zhēng)搶變量,所以變量需要加鎖;協(xié)程中任一時(shí)刻都只有一個(gè)線程,所以變量不需要加鎖,這篇文章主要介紹了Python中協(xié)程(coroutine)詳解,需要的朋友可以參考下2024-04-04
Python實(shí)戰(zhàn)小項(xiàng)目之身份證信息校驗(yàn)
讀萬卷書不如行萬里路,只學(xué)書上的理論是遠(yuǎn)遠(yuǎn)不夠的,只有在實(shí)戰(zhàn)中才能獲得能力的提升,本篇文章手把手帶你用Python做一個(gè)身份證信息校驗(yàn)的小項(xiàng)目,大家可以在過程中查缺補(bǔ)漏,提升水平2021-10-10
簡(jiǎn)單了解django處理跨域請(qǐng)求最佳解決方案
這篇文章主要介紹了簡(jiǎn)單了解django處理跨域請(qǐng)求最佳解決方案,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-03-03
Django框架實(shí)現(xiàn)逆向解析url的方法
這篇文章主要介紹了Django框架實(shí)現(xiàn)逆向解析url的方法,結(jié)合實(shí)例形式分析了Django逆向解析URL的原理、步驟、相關(guān)實(shí)現(xiàn)技巧與注意事項(xiàng),需要的朋友可以參考下2018-07-07
python通過裝飾器檢查函數(shù)參數(shù)數(shù)據(jù)類型的方法
這篇文章主要介紹了python通過裝飾器檢查函數(shù)參數(shù)數(shù)據(jù)類型的方法,涉及Python裝飾器的使用技巧,具有一定參考借鑒價(jià)值,需要的朋友可以參考下2015-03-03
django2用iframe標(biāo)簽完成網(wǎng)頁內(nèi)嵌播放b站視頻功能
這篇文章主要介紹了django2 用iframe標(biāo)簽完成 網(wǎng)頁內(nèi)嵌播放b站視頻功能,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2018-06-06

