flask email service学习笔记

来源:互联网 发布:传奇h5修改数据库教程 编辑:程序博客网 时间:2024/05/22 18:05

flask email service学习笔记

使用flask搭建一个邮件服务。提供RESTFul类型的api接口。接收,返回JSON数据
这里没有做更细致的优化配置,只是把路走通。关于nginx等的如何优化配置这里没有描述。
视频分享到youtube上了。
https://youtu.be/PsCGu52T98I
优酷链接
http://v.youku.com/v_show/id_XMzAwODM5ODU2MA==.html?f=50944544
GitHub的项目地址,可以直接git clone
https://github.com/aslucky/mailService.git

POST 创建新任务-发送邮件http://[hostname]/api/v1.0/emails

Flask工作流程
客户端——web 服务器——WSGI——application
这里写图片描述
WSGI:Web Server Gateway Interface,看图好理解一些,就是个中间件规范
这里写图片描述

用到的技术:nginx+gunicorn+celery(RabbitMQ)+flower+Supervisor+python3+logging
本次的开发环境是MAC OS 10.12 + 本机环境是python2.7虚拟环境是python3.6.2
简要说明一下上面用到的库都是做什么的。
nginx:是一个Web服务器,也可以用作反向代理,负载平衡器和HTTP缓存
gunicorn(Green Unicorn):Python WSGI HTTP Server for UNIX,是WSGI的一个实现。
celery:是一个异步分布式任务队列,需要RabbitMQ或者Redis来配合使用。
它的基本工作就是管理分配任务到不同的服务器,并且取得结果。至于说服务器之间是如何进行通信的?这个Celery本身不能解决。
所以,RabbitMQ作为一个消息队列管理工具被引入到和Celery集成,负责处理服务器之间的通信任务。
RabbitMQ:一套开源(MPL)的消息队列服务软件
flower:Flower是基于web的监控和管理Celery的工具.http://flower-docs-cn.readthedocs.io/zh/latest/index.html
Supervisor:是一个C/S架构的进程管理工具,可以很方便的用来启动、重启、关闭进程

实际部署的时候,只需要运行nginx+supervisor就可以了

搭建开发环境

这里使用的是anaconda所以使用conda来创建一个python3.6.x的虚拟环境

安装nginx,这里没有详细记录步骤,中间可能会遇到问题,网上搜索一下就可以解决了brew updatebrew install nginx# 安装RabbitMQbrew install rabbitmq# 查看一下现有虚拟环境conda env list# 创建一个python3的虚拟环境conda create --name flaskMailPy3 python=3.6.2# 激活虚拟环境source activate flaskMailPy3# 安装flaskpip install flask# 安装flask-mail扩展pip install flask-mail# 安装gunicornpip install gunicorn# 安装celerypip install celery# 安装flowerpip install flower# 安装supervisorpip install supervisor

使用nginx

# 查看安装信息(经常用到, 比如查看安装目录等)brew info nginx# 启动nginx服务brew services start nginx# 关闭nginx服务brew services stop nginx重新加载nginxnginx -s reloadnginx停止nginx -s stop# 查看所有进程监听的端口sudo lsof -i -P | grep -i "listen"# 查看某个端口是否被占用lsof -i:8000

利用http://localhost:8080进行访问
配置本地映射到gnunicorn

server {        listen       8080;        server_name  localhost;        #charset koi8-r;        # access_log  logs/host.access.log  main;        location / {            #root   html;            #index  index.html index.htm;            proxy_pass http://127.0.0.1:8000;            proxy_redirect off;            proxy_set_header Host $host:80;            proxy_set_header X-Real-IP $remote_addr;            proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;        }

启动nginx。以下部分通过配置supervisor启动即可。

使用gunicorn

参见gunicorn_cofig.py配置文件
启动gunicorn
gunicorn mailServerStudy:app -p mailServerStudy.pid -c gunicorn_config.py
停止gunicorn

cat *.pidkill xxx

使用Celery+Flower

http://www.celeryproject.org/

正确使用celery的7条建议
No.1 不要使用关系型数据库来作为AMQP的代理
NO.2 使用多个Queues(队列),不要只是使用默认的那个(default)
NO.3 使用优先级wokers
No.4 使用Celery’s的错误处理机制
No.5 使用Flower
No.6 只有真正需要才追踪task的结果
No.7 不要通过数据库或者ORM对象的方式来执行任务

使用flower管理任务:
打开浏览器 http://localhost:5555/

使用RabbitMQ

https://www.rabbitmq.com/

安装路径/usr/local/sbin,不会自动添加到环境变量中,需要自己设置一下。
还需要配置一下系统主机名(system host name),因为rabbitmq使用主机名在各端点之间做通讯的

sudo scutil --set HostName myhost.local# 然后添加到/etc/hosts127.0.0.1       localhost myhost myhost.local

常用命令,注意要给rabbitmq对应目录的写权限,否则运行时会提示错误

前台运行rabbitmq-server后台运行brew services start rabbitmq停止rabbitmq服务,这里特别说明不要使用kill来停止服务rabbitmqctl stop

使用Supervisor

Supervisor python2 环境。官方还没有出py3的版本,不过不影响管理py3的进程。

# 创建默认的配置文件,默认会到/etc/下面找,如果自定义了路径可以使用-c来指定路径echo_supervisord_conf > /etc/supervisord.conf# 要给写权限sudo chmod -R 777 /var/log/supervisor# 启动supervisord -c ~/Documents/java_library/supervisor.conf# 常用命令# 停止某一个进程,program_name 为 [program:x] 里的 xsupervisorctl stop program_name# 启动某个进程supervisorctl start program_name# 重启某个进程supervisorctl restart program_name# 结束所有属于名为 groupworker 这个分组的进程 (start,restart 同理)supervisorctl stop groupworker:# 结束 groupworker:name1 这个进程 (start,restart 同理)supervisorctl stop groupworker:name1# 停止全部进程,注:start、restart、stop 都不会载入最新的配置文件supervisorctl stop all# 载入最新的配置文件,停止原有进程并按新的配置启动、管理所有进程supervisorctl reload# 根据最新的配置文件,启动新配置或有改动的进程,配置没有改动的进程不会受影响而重启supervisorctl update

配置文件说明:这里补充一下,视频里面忘了说这个文件了/etc/supervisord.conf
配置日志等文件的路径:这里要注意,默认是临时目录,会被系统清理掉,需要修改一下。

[unix_http_server]file=/Users/zhengjun/Documents/java_library/supervisor/supervisor.sock   ; (the path to the socket file)[supervisord]logfile=/Users/zhengjun/Documents/java_library/supervisor//supervisord.log ; (main log file;default $CWD/supervisord.log)...pidfile=/Users/zhengjun/Documents/java_library/supervisor//supervisord.pid ; (supervisord pidfile;default supervisord.pid)

打开web管理支持:

[supervisorctl]serverurl=unix:///Users/zhengjun/Documents/java_library/supervisor//supervisor.sock ; use a unix:// URL  for a unix socketserverurl=http://127.0.0.1:9001 ; use an http:// url to specify an inet socket...

这里引入程序的配置项,视频里面讲解的是这里引入的配置文件。

[include]files = /Users/zhengjun/project/PycharmProjects/mailServerStudy/app/*.conf

开机自动启动 Supervisord,这一步没有实际操作过,这里就是记录一下
引用至:http://www.restran.net/2015/10/04/supervisord-tutorial/

添加到/etc/rc.local 里面的脚本中,需要添加在 exit 命令前,使用绝对路径# 如果是 Ubuntu 添加以下内容/usr/local/bin/supervisord -c /etc/supervisord.conf# 如果是 Centos 添加以下内容/usr/bin/supervisord -c /etc/supervisord.conf

还有个方法就是使用网友提供的各种系统的运行supervisor的脚本
https://github.com/Supervisor/initscripts

使用pycharm创建flask项目,指定flaskMailPy3环境。
右键Debug运行之后,点击控制台的链接,可以在浏览器中打开页面。
首先要做的是在上面添加utf-8编码

# coding:utf-8

添加发送邮件接口,直接看代码吧,东西不多。这里就不复制了。会在视频里面详细讲解
https://github.com/aslucky/mailService.git

补充说明:后来浏览网页的时候看到了一些开源的邮件库,下面是一个,还没具体查看。
envelopes:电子邮件库

原创粉丝点击