摘要:函數(shù)攜帶目的地址主題郵件體模板和一組關(guān)鍵字參數(shù)。許多擴展操作是在假設(shè)有活動的應(yīng)用程序和請求上下文的情況下進行的。但是當(dāng)函數(shù)在一個不同的線程上執(zhí)行,應(yīng)用程序上下文需要人為地創(chuàng)建使用。例如,執(zhí)行函數(shù)可以將郵件發(fā)送到的任務(wù)隊列中。
許多類型的應(yīng)用程序都會在某些事件發(fā)生的時候通知用戶,常用的溝通方法就是電子郵件。盡管在Flask應(yīng)用程序中,可以使用Python標(biāo)準(zhǔn)庫中的smtplib包來發(fā)送電子郵件,不過Flask-Mail擴展封裝了smtplib且與Flask整合的非常好。
1、使用Flask-Mail作為郵件支持使用pip安裝Flask-Mail:
(venv) $ pip install flask-mail
擴展連接到一個簡單郵件傳輸協(xié)議(SMTP)服務(wù)器并將郵件傳遞給它由它遞送。如果沒有給出配置,F(xiàn)lask-Mail則連接到localhost25端口并發(fā)送無驗證的電子郵件。表6-1所示的配置鍵列表可以用來配置SMTP服務(wù)器。
表格6-1. Flask-Mail SMTP服務(wù)器配置鍵
在開發(fā)過程中如果能連接到一個外部SMTP服務(wù)器會更方便。示例6-1展示了如何配置應(yīng)用程序通過谷歌的Gmail帳戶發(fā)送電子郵件。
示例6-1. hello.py:Flask-Mail配置Gmail
import os # ... app.config["MAIL_SERVER"] = "smtp.googlemail.com" app.config["MAIL_PORT"] = 587 app.config["MAIL_USE_TLS"] = True app.config["MAIL_USERNAME"] = os.environ.get("MAIL_USERNAME") app.config["MAIL_PASSWORD"] = os.environ.get("MAIL_PASSWORD")
建議:永遠不要將賬戶證書直接寫在你的腳本里面,尤其是如果你打算將你的的工作開源。為了保護你的帳戶信息,必須讓腳本從你的配置環(huán)境中導(dǎo)入敏感信息。
示例6-2展示了Flask-Mail的初始化。
示例6-2. hello.py:Flask-Mail初始化
from flask.ext.mail import Mail mail = Mail(app)
持有email服務(wù)器用戶名和密碼的兩個變量需要在環(huán)境中定義。如果你是使用Linux或Mac OS X上的bash,你可以設(shè)置這些變量如下:
(venv) $ export MAIL_USERNAME=(venv) $ export MAIL_PASSWORD=
對于Windows用戶,可以設(shè)置環(huán)境變量如下:
(venv) $ set MAIL_USERNAME=(venv) $ set MAIL_PASSWORD=
為了測試配置,你可以開啟一個shell會話并發(fā)送測試email:
(venv) $ python hello.py shell >>> from flask.ext.mail import Message >>> from hello import mail >>> msg = Message("test subject", sender="you@example.com", ... recipients=["you@example.com"]) >>> msg.body = "text body" >>> msg.html = "HTML body" >>> with app.app_context(): ... mail.send(msg) ...
注意,F(xiàn)lask-Mail的send()函數(shù)使用current_app,所以它需要執(zhí)行已激活的應(yīng)用程序上下文。
為了避免每次都手動創(chuàng)建電子郵件消息,將應(yīng)用電子郵件發(fā)送功能的共同部分抽象到一個函數(shù)中是非常不錯的做法。另一個好處是,這個函數(shù)可以用Jinja2模板盡情渲染。示例6-3展示了怎么實現(xiàn)。
示例6-3. hello.py:Email支持
from flask.ext.mail import Message app.config["FLASKY_MAIL_SUBJECT_PREFIX"] = "[Flasky]" app.config["FLASKY_MAIL_SENDER"] = "Flasky Admin" def send_email(to, subject, template, **kwargs): msg = Message(app.config["FLASKY_MAIL_SUBJECT_PREFIX"] + subject, sender=app.config["FLASKY_MAIL_SENDER"], recipients=[to]) msg.body = render_template(template + ".txt", **kwargs) msg.html = render_template(template + ".html", **kwargs) mail.send(msg)
為發(fā)件人的主題和地址定義前綴字符串的函數(shù)依賴于兩個特定于應(yīng)用程序的配置鍵。send_email函數(shù)攜帶目的地址、主題、郵件體模板和一組關(guān)鍵字參數(shù)。模板名不能有擴展,這樣兩個版本的模板可以使用純文本或富文本。調(diào)用者傳遞關(guān)鍵字參數(shù)給render_template()調(diào)用,這樣模板就可以生成email體。
index()視圖函數(shù)可以非常容易的擴充用來發(fā)送一個email給管理員,當(dāng)從表單中收到一個新的名字的時候。示例6-4展示所做的改動。
示例6-4. hello.py:Email示例
# ... app.config["FLASKY_ADMIN"] = os.environ.get("FLASKY_ADMIN") # ... @app.route("/", methods=["GET", "POST"]) def index(): form = NameForm() if form.validate_on_submit(): user = User.query.filter_by(username=form.name.data).first() if user is None: user = User(username=form.name.data) db.session.add(user) session["known"] = False if app.config["FLASKY_ADMIN"]: send_email(app.config["FLASKY_ADMIN"], "New User", "mail/new_user", user=user) else: session["known"] = True session["name"] = form.name.data form.name.data = "" return redirect(url_for("index")) return render_template("index.html", form=form, name=session.get("name"), known=session.get("known", False))
啟動過程中,在FLASKY_ADMIN環(huán)境變量中給出的email收件人會加載到同名的配置變量中。需要創(chuàng)建文本和HTML兩個版本的email模板文件。這些文件都存儲在template內(nèi)的mail子目錄中,讓他們獨立于普通模板。電子郵件模板需要給出用戶作為該模板參數(shù),因此send_email()調(diào)用包括用戶來作為一個關(guān)鍵字參數(shù)。
建議:如果你有克隆在GitHub上的應(yīng)用程序,你現(xiàn)在可以運行git checkout 6a來切換到這個版本的應(yīng)用程序。
除了前面描述的MAIL_USERNAME和MAIL_PASSWORD環(huán)境變量,這個版本的應(yīng)用程序需要FLASKY_ADMIN環(huán)境變量。對于Linux和Mac OS X用戶來說,啟動應(yīng)用程序命令:
(venv) $ export FLASKY_ADMIN=
對于Windows用戶,命令如下:
(venv) $ set FLASKY_ADMIN=
使用這些環(huán)境變量設(shè)置,當(dāng)你每次在表單中輸入一個新的名字的時候都可以測試應(yīng)用程序和接收電子郵件。
如果你發(fā)送一些測試郵件,你可能注意到mail.send()函數(shù)在發(fā)送電子郵件的時候會阻塞幾秒鐘,這段時間瀏覽器看起來沒有響應(yīng)。為了避免請求處理不必要的延誤,可以將郵件發(fā)送功能移到一個后臺線程去處理。示例6-5展示了以上改動。
示例6-5. hello.py:異步郵件支持
from threading import Thread def send_async_email(app, msg): with app.app_context(): mail.send(msg) def send_email(to, subject, template, **kwargs): msg = Message(app.config["FLASKY_MAIL_SUBJECT_PREFIX"] + subject, sender=app.config["FLASKY_MAIL_SENDER"], recipients=[to]) msg.body = render_template(template + ".txt", **kwargs) msg.html = render_template(template + ".html", **kwargs) thr = Thread(target=send_async_email, args=[app, msg]) thr.start() return thr
這個實現(xiàn)突顯了一個有趣的問題。許多Flask擴展操作是在假設(shè)有活動的應(yīng)用程序和請求上下文的情況下進行的。Flask-Mail的send()函數(shù)使用current_app,所以它需要已激活的應(yīng)用程序上下文。但是當(dāng)mail.send()函數(shù)在一個不同的線程上執(zhí)行,應(yīng)用程序上下文需要人為地創(chuàng)建使用app.app_context()。
建議:如果你有克隆在GitHub上的應(yīng)用程序,你現(xiàn)在可以運行git checkout 6b來切換到這個版本的應(yīng)用程序。
如果你現(xiàn)在運行應(yīng)用程序,你會發(fā)現(xiàn)它響應(yīng)更快了,但請記住,發(fā)送大量的電子郵件的應(yīng)用程序,其擁有一個致力于發(fā)送電子郵件的服務(wù)比開啟一個新的線程更合適。例如,執(zhí)行send_async_email()函數(shù)可以將郵件發(fā)送到Celery的任務(wù)隊列中。
本章完成的是大多數(shù)web應(yīng)用程序必備的功能。現(xiàn)在的問題是,hello.py腳本開始大,這使得它變得更難管理。在下一章中,你將學(xué)習(xí)如何構(gòu)建一個更大的應(yīng)用程序。
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://www.ezyhdfw.cn/yun/45324.html
摘要:被定義在包的構(gòu)造函數(shù)中的應(yīng)用程序工廠函數(shù)會在示例中展示。這個構(gòu)造函數(shù)導(dǎo)入大部分當(dāng)前需要使用的擴展,但因為沒有應(yīng)用程序?qū)嵗跏蓟鼈?,它可以被?chuàng)建但不初始化通過不傳遞參數(shù)給它們的構(gòu)造函數(shù)。而應(yīng)用程序范圍內(nèi)的錯誤處理則必須使用。 雖然小型web應(yīng)用程序用單個腳本可以很方便,但這種方法卻不能很好地擴展。隨著應(yīng)用變得復(fù)雜,在單個大的源文件中處理會變得問題重重。 與大多數(shù)其他web框架不同,F(xiàn)l...
摘要:帶附件的郵件有時候,我們發(fā)郵件的時候需要添加附件,比如文檔和圖片等,這也很簡單,代碼如下郵件服務(wù)器地址郵件服務(wù)器端口啟用上面的代碼中,我們通過打開了本機的某張圖片,然后通過方法將附件內(nèi)容添加到對象。 前往本文博客 簡介 給用戶發(fā)送郵件是 Web 應(yīng)用中最常見的任務(wù)之一,比如用戶注冊,找回密碼等。Python 內(nèi)置了一個 smtplib 的模塊,可以用來發(fā)送郵件,這里我們使用 Flask...
摘要:接收用戶請求并分析請求的。執(zhí)行函數(shù)并生成響應(yīng),返回給瀏覽器。這個過程我們稱為注冊路由,路由負責(zé)管理和函數(shù)之間的映射,而這個函數(shù)則被稱為視圖函數(shù)。文件是一個名為的文本文件,它存儲了項目中提交時的忽略文件規(guī)則清單。 flask簡述 Flask 是一個基于 Python 開發(fā)并且依賴 jinja2 模板和 Werkzeug WSGI 服務(wù)的一個微型框架,對于 Werkzeug 本質(zhì)是 Soc...
摘要:他和妻子四個孩子兩只狗和一只貓共同生活在俄勒岡州波特蘭市。。還邀請他根據(jù)書的內(nèi)容,制作了兩個視頻教程。 showImg(http://img4.douban.com/lpic/s27205547.jpg); 這本書算是學(xué)習(xí)Flask的權(quán)威材料了,網(wǎng)上很多人都是推薦從這本書開始學(xué)習(xí)。起初,作者在自己的博客發(fā)布了一個大型的Flask建站教程,在這個教程大受歡迎的基礎(chǔ)上,才與OReilly公...
摘要:每個表單域都可以連接到一個或多個是一個用于檢查用戶提交的輸入是否合法的函數(shù)。表單域構(gòu)造函數(shù)的第一個參數(shù)是一個,在渲染表單到時會使用。驗證確保提交的表單域不為空。表單域驗證都是直接從包中導(dǎo)入。表格展示了一組支持的標(biāo)準(zhǔn)表單域。 第二章中介紹的request對象公開了所有客戶端發(fā)送的請求信息。特別是request.form可以訪問POST請求提交的表單數(shù)據(jù)。 盡管Flask的request...
閱讀 3510·2019-08-30 13:15
閱讀 1456·2019-08-29 18:34
閱讀 881·2019-08-29 15:18
閱讀 3534·2019-08-29 11:21
閱讀 3311·2019-08-29 10:55
閱讀 3760·2019-08-26 10:36
閱讀 1928·2019-08-23 18:37
閱讀 1905·2019-08-23 16:57