摘要:函數攜帶目的地址主題郵件體模板和一組關鍵字參數。許多擴展操作是在假設有活動的應用程序和請求上下文的情況下進行的。但是當函數在一個不同的線程上執行,應用程序上下文需要人為地創建使用。例如,執行函數可以將郵件發送到的任務隊列中。
許多類型的應用程序都會在某些事件發生的時候通知用戶,常用的溝通方法就是電子郵件。盡管在Flask應用程序中,可以使用Python標準庫中的smtplib包來發送電子郵件,不過Flask-Mail擴展封裝了smtplib且與Flask整合的非常好。
1、使用Flask-Mail作為郵件支持使用pip安裝Flask-Mail:
(venv) $ pip install flask-mail
擴展連接到一個簡單郵件傳輸協議(SMTP)服務器并將郵件傳遞給它由它遞送。如果沒有給出配置,Flask-Mail則連接到localhost25端口并發送無驗證的電子郵件。表6-1所示的配置鍵列表可以用來配置SMTP服務器。
表格6-1. Flask-Mail SMTP服務器配置鍵
在開發過程中如果能連接到一個外部SMTP服務器會更方便。示例6-1展示了如何配置應用程序通過谷歌的Gmail帳戶發送電子郵件。
示例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")
建議:永遠不要將賬戶證書直接寫在你的腳本里面,尤其是如果你打算將你的的工作開源。為了保護你的帳戶信息,必須讓腳本從你的配置環境中導入敏感信息。
示例6-2展示了Flask-Mail的初始化。
示例6-2. hello.py:Flask-Mail初始化
from flask.ext.mail import Mail mail = Mail(app)
持有email服務器用戶名和密碼的兩個變量需要在環境中定義。如果你是使用Linux或Mac OS X上的bash,你可以設置這些變量如下:
(venv) $ export MAIL_USERNAME=(venv) $ export MAIL_PASSWORD=
對于Windows用戶,可以設置環境變量如下:
(venv) $ set MAIL_USERNAME=(venv) $ set MAIL_PASSWORD=
為了測試配置,你可以開啟一個shell會話并發送測試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) ...
注意,Flask-Mail的send()函數使用current_app,所以它需要執行已激活的應用程序上下文。
為了避免每次都手動創建電子郵件消息,將應用電子郵件發送功能的共同部分抽象到一個函數中是非常不錯的做法。另一個好處是,這個函數可以用Jinja2模板盡情渲染。示例6-3展示了怎么實現。
示例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)
為發件人的主題和地址定義前綴字符串的函數依賴于兩個特定于應用程序的配置鍵。send_email函數攜帶目的地址、主題、郵件體模板和一組關鍵字參數。模板名不能有擴展,這樣兩個版本的模板可以使用純文本或富文本。調用者傳遞關鍵字參數給render_template()調用,這樣模板就可以生成email體。
index()視圖函數可以非常容易的擴充用來發送一個email給管理員,當從表單中收到一個新的名字的時候。示例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環境變量中給出的email收件人會加載到同名的配置變量中。需要創建文本和HTML兩個版本的email模板文件。這些文件都存儲在template內的mail子目錄中,讓他們獨立于普通模板。電子郵件模板需要給出用戶作為該模板參數,因此send_email()調用包括用戶來作為一個關鍵字參數。
建議:如果你有克隆在GitHub上的應用程序,你現在可以運行git checkout 6a來切換到這個版本的應用程序。
除了前面描述的MAIL_USERNAME和MAIL_PASSWORD環境變量,這個版本的應用程序需要FLASKY_ADMIN環境變量。對于Linux和Mac OS X用戶來說,啟動應用程序命令:
(venv) $ export FLASKY_ADMIN=
對于Windows用戶,命令如下:
(venv) $ set FLASKY_ADMIN=
使用這些環境變量設置,當你每次在表單中輸入一個新的名字的時候都可以測試應用程序和接收電子郵件。
如果你發送一些測試郵件,你可能注意到mail.send()函數在發送電子郵件的時候會阻塞幾秒鐘,這段時間瀏覽器看起來沒有響應。為了避免請求處理不必要的延誤,可以將郵件發送功能移到一個后臺線程去處理。示例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
這個實現突顯了一個有趣的問題。許多Flask擴展操作是在假設有活動的應用程序和請求上下文的情況下進行的。Flask-Mail的send()函數使用current_app,所以它需要已激活的應用程序上下文。但是當mail.send()函數在一個不同的線程上執行,應用程序上下文需要人為地創建使用app.app_context()。
建議:如果你有克隆在GitHub上的應用程序,你現在可以運行git checkout 6b來切換到這個版本的應用程序。
如果你現在運行應用程序,你會發現它響應更快了,但請記住,發送大量的電子郵件的應用程序,其擁有一個致力于發送電子郵件的服務比開啟一個新的線程更合適。例如,執行send_async_email()函數可以將郵件發送到Celery的任務隊列中。
本章完成的是大多數web應用程序必備的功能。現在的問題是,hello.py腳本開始大,這使得它變得更難管理。在下一章中,你將學習如何構建一個更大的應用程序。
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/45324.html
摘要:被定義在包的構造函數中的應用程序工廠函數會在示例中展示。這個構造函數導入大部分當前需要使用的擴展,但因為沒有應用程序實例初始化它們,它可以被創建但不初始化通過不傳遞參數給它們的構造函數。而應用程序范圍內的錯誤處理則必須使用。 雖然小型web應用程序用單個腳本可以很方便,但這種方法卻不能很好地擴展。隨著應用變得復雜,在單個大的源文件中處理會變得問題重重。 與大多數其他web框架不同,Fl...
摘要:帶附件的郵件有時候,我們發郵件的時候需要添加附件,比如文檔和圖片等,這也很簡單,代碼如下郵件服務器地址郵件服務器端口啟用上面的代碼中,我們通過打開了本機的某張圖片,然后通過方法將附件內容添加到對象。 前往本文博客 簡介 給用戶發送郵件是 Web 應用中最常見的任務之一,比如用戶注冊,找回密碼等。Python 內置了一個 smtplib 的模塊,可以用來發送郵件,這里我們使用 Flask...
摘要:接收用戶請求并分析請求的。執行函數并生成響應,返回給瀏覽器。這個過程我們稱為注冊路由,路由負責管理和函數之間的映射,而這個函數則被稱為視圖函數。文件是一個名為的文本文件,它存儲了項目中提交時的忽略文件規則清單。 flask簡述 Flask 是一個基于 Python 開發并且依賴 jinja2 模板和 Werkzeug WSGI 服務的一個微型框架,對于 Werkzeug 本質是 Soc...
摘要:他和妻子四個孩子兩只狗和一只貓共同生活在俄勒岡州波特蘭市。。還邀請他根據書的內容,制作了兩個視頻教程。 showImg(http://img4.douban.com/lpic/s27205547.jpg); 這本書算是學習Flask的權威材料了,網上很多人都是推薦從這本書開始學習。起初,作者在自己的博客發布了一個大型的Flask建站教程,在這個教程大受歡迎的基礎上,才與OReilly公...
摘要:每個表單域都可以連接到一個或多個是一個用于檢查用戶提交的輸入是否合法的函數。表單域構造函數的第一個參數是一個,在渲染表單到時會使用。驗證確保提交的表單域不為空。表單域驗證都是直接從包中導入。表格展示了一組支持的標準表單域。 第二章中介紹的request對象公開了所有客戶端發送的請求信息。特別是request.form可以訪問POST請求提交的表單數據。 盡管Flask的request...
閱讀 3460·2019-08-30 13:15
閱讀 1400·2019-08-29 18:34
閱讀 822·2019-08-29 15:18
閱讀 3480·2019-08-29 11:21
閱讀 3246·2019-08-29 10:55
閱讀 3688·2019-08-26 10:36
閱讀 1868·2019-08-23 18:37
閱讀 1816·2019-08-23 16:57