windowspythonflask
① 在python的Flask框架下收发电子邮件
这篇文章主要介绍了在Python的Flask框架下收发电子邮件的教程,主要用到了Flask中的Flask-mail工具,需要的朋友可以参考下
在大多数此类教程中都会不遗余力的介绍如何使用数据库。今天我们对数据库暂且不表,而是来关注另一个在web应用中很重要的特性:如何推送邮件给用户。
在某个轻量级应用中我们可能会添加一个如下的邮件服务功能:当用户有了新的粉丝后,我们发送一封邮件通知用户。有很多方法可以实现这个特性,而我们希望提供出一种可复用的通用框架来处理。
Flask-Mail介绍
对于我们来说是幸运的,现在已经有很多外部插件来处理邮件,虽说不能百分百按照我们的想法去处理,但已经相当接近了。
在虚拟环境中安装 Flask-Mail是相当简单的。Windows以外的用户可以让手利用以下命令来安装:
?
1
flask/bin/pip install flask-mail
Windows用户的安装稍有不同,因为Flask-Mail所使用的一些模块不能再Windows系统上运行,你可以使用以下命令:
?
1
flaskScriptspip install --no-deps lamson chardet flask-mail
配置:
回想汪指一下前文中单元测试部分的案例,我们通过添加配置支持了一个这样的功能:当应用的某个版本测试出错时可以邮件通知我们。从这个例子就可以看出如何配置使用邮件支持。
再次提醒大家,我们需要设置两个方面的内容:
邮件服务器信息
用户邮箱地址
如下正是前文中所用到的配置
# email server
MAIL_SERVER =
MAIL_PORT = 25
MAIL_USE_TLS = False
MAIL_USE_SSL = False
MAIL_USERNAME = you
MAIL_PASSWORD = your-password
# administrator list
ADMINS = [[email protected]]
其中并没有设置切实可用的邮件服务器和邮箱。现在我们通过一个例子来看如何使用gmail邮箱账户来发送邮件:
# email server
MAIL_SERVER =
MAIL_PORT = 465
MAIL_USE_TLS = False
MAIL_USE_SSL = True
MAIL_USERNAME = your-gmail-username
MAIL_PASSWORD = your-gmail-password
# administrator list
ADMINS = [[email protected]]
另外我们也可以初始化一个Mail对象来连接SMTP邮件服务器,发送邮件:
?
1
2
from flask.ext.mail import Mail
mail = Mail(app)
发个邮件试试!
为了了解flask-mail如何工作的,我们可以从命令行发一封邮件看看。进入python shell并执行如下的脚本:
?
7
from flask.ext.mail import Message
from app import mail
from config import ADMINS
msg = Message(test subject, sender = ADMINS[0], recipients = ADMINS)
msg.body = text body
msg.html = bHTML/b body
mail.send(msg)
上面这段代码会根据inconfig.py中配置的邮箱地址列表,以首个邮箱作为发件人给所有邮箱发送一封邮件。邮件内容会以文本和html两种格式呈现,而你能看到哪种格式取决于你的邮件客户端。
多么简单小巧!你完全可以现在就把它集成到你的应用中。
邮件框架
我们现在可以编写一个帮助函数来发送邮件。困滑配这是以上测试中一个通用版的测试。我们把这个函数放进一个新的原文件中用作邮件支持(fileapp/emails.py):
?
7
8
from flask.ext.mail import Message
from app import mail
def send_email(subject, sender, recipients, text_body, html_body):
msg = Message(subject, sender, recipients)
msg.body = text_body
msg.html = html_body
mail.send(msg)
Flask-Mail的邮件支持超出了我们目前的使用范围,像密件抄送和附件的功能并不会在此应用中得以使用。
Follower 提醒
现在,我们已经有了发邮件的基本框架,我们可以写发送follower提醒的函数了 (fileapp/emails.py):
11
from flask import render_template
from config import ADMINS
def follower_notification(followed, follower):
send_email([microblog] %s is now following you! % follower.nickname,
ADMINS[0],
[followed.email],
render_template(follower_email.txt,
user = followed, follower = follower),
render_template(follower_email.html,
user = followed, follower = follower))
你在这里找到任何惊喜了吗?我们的老朋友render_template函数有一次出现了。
如果你还记得,我们使用这个函数在views渲染模版. 就像在views里写html不好一样,使用邮件模版是理想的选择。我们要可能的将逻辑和表现分开,所以email模版也会和其它试图模版一起放到在模版文件夹里.
所以,我们需要为follower提醒邮件写纯文本和网页版的邮件模版,下面这个是纯文本的版本 (fileapp/templates/follower_email.txt):
?
7
8
9
Dear {{user.nickname}},
{{follower.nickname}} is now a follower. Click on the following link to visit {{follower.nickname}}s profile page:
{{url_for(user, nickname = follower.nickname, _external = True)}}
Regards,
The microblog admin
下面这个是网页版的邮件,效果会更好(fileapp/templates/follower_email.html):
11
12
13
pDear {{user.nickname}},/p
pa href={{url_for(user, nickname = follower.nickname, _external = True)}}{{follower.nickname}}/a is now a follower./p
table
tr valign=top
tdimg src={{follower.avatar(50)}}/td
td
a href={{url_for(user, nickname = follower.nickname, _external = True)}}{{follower.nickname}}/abr /
{{follower.about_me}}
/td
/tr
/table
pRegards,/p
pThe codemicroblog/code admin/p
注解:模版中的url_for函数的 _external = True 参数的意义.默认情况下,url_for 函数生成url是相对我们的域名的。例如,url_for(index)函数返回值是/index, 但是,发邮件是我们想要
最后一步是处理“follow”过程,即触发邮件提醒时的视图函数,(fileapp/views.py):
?
7
8
9
from emails import follower_notification
@app.route(/follow/nickname)
@login_required
def follow(nickname):
user = User.query.filter_by(nickname = nickname).first()
# ...
follower_notification(user, g.user)
return redirect(url_for(user, nickname = nickname))
现在你可以创建两个用户(如果还没有用户的话)尝试着用让一个用户follow另一个用户,理解邮件提醒是怎样工作的。
就是这样吗?我们做完了吗?
我们可能心底里很兴奋完成了这项工作并且把邮件提醒功能同未完成列表里删除。
但是,如果你现在测试下应用,你会发现当你单击follow链接的时候,页面会2到3秒才会响应,浏览器才会刷新,这在之前是没有的。
发生了什么?
问题是,Flask-Mail 使用同步模式发送电子邮件。 从电子邮件发送开始,直到电子邮件交付后,给浏览器发回其响应,在整个过程中,Web服务器会一直阻塞。如果我们试图发送电子邮件到一个服务器是缓慢的,甚至更糟糕的,暂时处于脱机状态,你能想象会发生什么吗?很不好。
这是一个可怕的限制,发送电子邮件应该是后台任务且不会干扰Web服务器,让我们看看我们如何能够解决这个问题。
Python中执行异步调用
我们想send_email 函数发完邮件后立即返回,需要让发邮件移动到后台进程来异步执行。
事实上python已经对异步任务提供了支持,但实际上,还可以用其他的方式,比如线程和多进程模块也可以实现异步任务。
每当我们需要发邮件的时候,启动一个线程来处理,比启动一个全新的进程节省资源。所以,让我们将mail.send(msg)调用放到另一个线程中。(fileapp/emails.py):
11
from threading import Thread
def send_async_email(msg):
mail.send(msg)
def send_email(subject, sender, recipients, text_body, html_body):
msg = Message(subject, sender = sender, recipients = recipients)
msg.body = text_body
msg.html = html_body
thr = threading.Thread(target = send_async_email, args = [msg])
thr.start()
如果你测试‘follow‘函数,现在你会发现浏览器在发送邮件之前会刷新。
所以,我们已经实现了异步发送,但是,如果未来在别的需要异步功能的地方难道我们还需要在实现一遍吗?
过程都是一样的,这样就会在每一种情况下都有重复代码,这样非常不好。
我们可以通过 decorator改进代码。使用装饰器的代码是这样的:
11
from decorators import async
@async
def send_async_email(msg):
mail.send(msg)
def send_email(subject, sender, recipients, text_body, html_body):
msg = Message(subject, sender = sender, recipients = recipients)
msg.body = text_body
msg.html = html_body
send_async_email(msg)
更好了,对不对?
实现这种方式的代码实际上很简单,创建一个新源文件(fileapp/decorators.py):
?
7
from threading import Thread
def async(f):
def wrapper(*args, **kwargs):
thr = Thread(target = f, args = args, kwargs = kwargs)
thr.start()
return wrapper
现在我们对异步任务创建了个有用的框架(framework), 我们可以说已经完成了!
仅仅作为一个练习,让我们思考一下为什么这个方法会看上去使用了进程而不是线程。我们并不想每当我们需要发送一封邮件时就有一个进程被启动,所以我们能够使用thePoolclass而不用themultiprocessingmole。这个类会创建指定数量的进程(这些都是主进程的子进程),并且这些子进程会通过theapply_asyncmethod送到进程池,等待接受任务去工作。这可能对于一个繁忙的网站会是一个有趣的途径,但是我们目前仍将维持现在线程的方式。
② python用于web开发的第三方库有哪些
1. wxPython
wxPython 是一个跨平台的 GUI 工具集,是 Python 语言的一套优秀的 GUI 图形库,允许程序员创建完整的、功能键全的 GUI 用户界面。它以wxWidgets为基础,可以分别在Windows、Mac OS、linux上调用它们的本地组件,让 GUI 程序在不同的平台上显示对应的风格。
2. Kivy
Kivy 是一个开源库,能够让使用相同源代码创建的程序实现跨平台运行,而且它还可以做创新型用户界面开发,如果有做创新型用户界面的可以关注一下。
3. Dabo
Dabo是一个跨平台的应用程序开发框架,它使用Python语言开发,基于wxpython的再封装库。作为一个跨平台应用开发框架,它可以用来建立以数据为中心的应用程序,而且还提供数据库访问,商业逻辑以及用户界面。
4. Flexx
Flexx 是一个Python工具包,可以用来创建图形化界面程序,还支持使用 Web 技术进行界面的渲染,只要有 Python 和浏览器就可以运行。
5. Tkinter
这是一个跨平台图形用户界面GUI开发工具,是Tk图形用户界面工具包标准的Python接口,它很轻量,而且可以运行于绝大多数的Unix平台、Windows和Macintosh系统。
6. PyQt
PyQt 是一个非常全面的库,是Python编程语言和Qt库的成功融合。Qt本身是一个扩展的C++ GUI应用开发框架,可以在UNIX、Windows和Mac OS X上运行,而且能跨平台使用,被广泛应用于许多行业。
7. PyGTK
PyGTK 主要适用于 Linux/UNIX 系统,基于老版本的 GTK+2 的库提供绑定,借助于底层 GTK+2 所提供的各种可视化元素和组件,能开发出在 GNOME 桌面系统上运行的软件。值得一提的是,PyGTK 对 GTK+2 的C语言进行了简单封装,提供了面向对象的编程接口。
8. Pywin32
Windows Pywin32 库允许我们像 VC 一样的形式使用 Python 开发 win32 应用。Pywin32提供了很多访问windows的API。较重要的三个模块就是win32api、win32gui和win32con。
③ 在Windows10下能用pip方式给python2.7添加tensorflow支持库吗
在Windows10下能用pip方式给python2.7添加tensorflow支持库。
操作步骤:
1、在命令行下切换到python目录,一般为c:python27,pip在python安装目录的Scripts目录下,命令如下:
cd c:python27scripts
2、切换到目录之后直接使用命令安装即可,命令如下,例如要安装flask,则使用:
pip insatll flask
3、如果在windows下安装失败提示:Unable to find vcvarsall.bat,则说明这个包需要编译,则要在WINDOWS系统中安装visual studio 2008。
4、、linux下pip安装package与WINDOWS的语法相同,使用pip install SomePackage即可,linux下需要注意的是权限问题,应当使用root用户执行命令。
④ python编辑器哪个好用
第一:Sublime Text
Sublime Text轻量级的代码编辑器,跨平台,支持几十种编程语言,包括Python、Java、C、C++等,小巧灵活、运行轻快,支持代码高亮、自动补全、语法提示,插件扩展丰富,是一个非常不错的代码编辑器,配置相关文件后,可直接运行Python程序。Sublime
Text是开发者中最流行的编辑器之一,多功能、支持多种语言,深受开发者的喜欢。
第二、VS Code
VS Code是微软开发的一个跨平台的代码编辑器,支持常见的编程语言开发,插件拓展丰富,不仅智能补全、语法检查、代码高亮,还支持git功能,运行流畅,是一款非常受欢迎的代码编辑器,安装相关插件之后,也可以直接运行Python程序。
第三、Atom
Atom是github专门为程序员开发的一个代码编辑器,也是跨平台的,界面简洁直观,使用起来非常方便,自动补全、代码高亮、语法提示、启动运行速度较快,对于初学者来说,使用起来非常简单。
第四、PyCharm
PyCharm是一个专门用于Python开发的IDE,常见的功能有:代码补全、智能提示、语法检查,这个软件都支持。除此之外,还集成了版本控制、单元测试、git功能,可以快速创建Django、Flask等Python
Web框架,使用起来非常不错,在开发大型项目中经常会用到,唯一的缺点是,启动起来比较卡,还不是免费的,不过可以下载社区免费版的。
第五:Vim
Vim可以说是Python最好的IDE。Vim是高级文本编辑器,旨在提供实际的Unix编辑器,Vi功能,支持更多更完善的特性集。Vim不需要花费太多的学习时间,一旦你需要一个无缝的编辑体验,那么就会把Vim集成到你的工作流中。
第六:Eclipse with PyDev
Eclipse with PyDev是非常流行的IDE,而且已经有很久的历史了。Eclipse with PyDev允许开发者创建有用和交互式的Web应用。PyDev是Eclipse开发Python的IDE,支持Python、Jython和lronPython的开发。
第七:Emacs
GNU Emacs是可扩展,自动以的文本编辑器,甚至有更多的功能。Emacs的核心是Emacs Lisp解析器,但是支持文本编辑。如果你已经使用过Vim,可以尝试一下Emacs。
第八:Komodo Edit
Komodo Edit是一款非常干净而且专业的Python IDE。
第九:Wing
Wing的PythonIDE兼容Python2.x和3.x,可以结合Django、matplotlib、Zope、Plone、APP Engine、PyQt和其他Python框架使用。Wing支持测试驱动开发,集成了单元测试,nose和Django框架的执行和调试功能。Wing IDE启动和运行的速度都非常快,支持Windows、Linux、OS X和Python versi。
第十:PyScripter
PyScripter是一款免费、开源的Python集成开发环境。
第十一:The Eric Python IDE
Eric是全功能的Python和Ruby编辑器和IDE,是使用Python编写的。Eric基于跨平台的GUI工具包QT,集成了高度灵活的Scintilla编辑器控件,Eric包括一个插件系统,允许简单的对IDE进行功能性扩展。
第十二:IEP
IEP是跨平台的Python IDE,旨在提供简单高效的Python开发环境,包括两个重要的组件:编辑器和shell,并且提供插件工具集从各个方面来提高开发人员的效率。