发布时间:2019/02/09 16:16:10   更新时间:2020/07/31 19:52:09
用flask开发过一些嵌入式设备的维护页面,也开发过网站。总体来说,flask开发嵌入式设备的bs操作维护产品的后端很方便,优点大于缺点;但开发一个网站,缺点大于优点。这个话题,在另一篇文章《django和flask的选择》里讲过了,这个系列的文章只谈些经验。
先推荐下flask学习的一些有用途径:
flask开发的入门书籍,首推《Flask Web开发》Miguel Grinberg著,安道译,人民邮电出版社。如果觉得不够,《Python Web开发实践》董伟明著,电子工业出版社。这个也可以看看。第一本是关键。
网上的资源很多:
flask官网:http://flask.pocoo.org/
教程类中文网:http://www.pythondoc.com/flask/
都可以看看。
总体来说,精简的python后端架构里边,flask的资料最多最成熟,网上搜索能解决绝大部分问题。
本文算是以前老代码的总结,所以不保证在最新版本的os/python/flask/flask插件上调试通过。重点是思想和经验。
本文环境要点:
ubuntu(linux)、python2.7。
eventlet==0.22.0
Flask==0.12.2
Flask-Login==0.4.1
Flask-RESTful==0.3.6
Flask-SocketIO==2.9.3
Flask-SQLAlchemy==2.3.2
Flask-Uploads==0.2.1
gunicorn==18.0
Jinja2==2.10
MySQL-python==1.2.5
SQLAlchemy==1.2.2
Werkzeug==0.14.1
我先谈谈部署。
很多人说,部署python的web后端框架的时候,觉得“人生苦短,我用python”是错的。这个可以理解。初开始,部署python的web后端,是很麻烦。flask尤其麻烦一些,究其原因,flask是精简框架,随着功能越来越多,用的库会越来越多。
先谈谈嵌入式设备部署要点:
嵌入式设备的芯片、和os,首先要可用。如果不可用,你要交叉编译,那还是放弃python吧,拿纯C去做一切吧。因为,未知的坑太多。如果说各种高级语言的各种成熟的库都能用于各种芯片、板子了,那嵌入式公司就没有杀手锏了,都变成互联网公司了。
一般来说,x86芯片的板子,linux的系统,就可以用。os实在不行,可以让linux裁剪补上些功能即可。
1、移植python。
python(cpython)通过源码下载、编译、安装、软连接指向,可以安装在要用的嵌入式设备的os上。
然后使用的时候,会出现python缺少一些库的错误。如果遇上这样的错误,只能将对应的库先安装到os上,再重新编译python源码包,重新安装、移植。
2、移植flask相关的库。
在一个能上网的环境上,pip安装这些库,找到安装目录,直接把安装的库文件拷入嵌入式设备上。(嵌入式设备往往不见得能联网)
再在嵌入式设备的os上设置好环境变量。主要是PYTHONPATH。(还可能需要设一下PATH、LD_LIBRARY_PATH等。)
这样就连起来能用了。
3、不要用nginx、gunicorn/uwsgi、virtualenv。
嵌入式设备上,空间往往很紧张,上这些东西浪费空间。
嵌入式设备的bs系统的用户量,一般不会太多,不用太考虑并发量。用开发服务器即可。
最关键的,这些东西,对os的要求很高。嵌入式设备的linux支持这些东西,错误太多,不胜其烦。
至于virtualenv。嵌入式设备的代码调试好以后,就和硬件一起提供。至少版本也是固定提供的,所以这个东西别说安装不上,实际也不需要。
4、要注意开源协议。
如果做商业产品,要考虑到使用的库的开源协议。可以一个一个在库的info文件里去查。看看是否合适,如果不合适,要换库,或者想办法规避。
现在的云厂商的环境都非常好。云上的os和python版本足够用,一般不要瞎折腾,划不来。那么在云上就不存在os和python的替换或者升级问题了。唯一要注意的是python2和python3使用的差别。主要是要区分pip和pip3,再安装virtualenv以后,就没有什么区别了。
1、使用nginx、gunicorn、virtualenv。
nginx可以方便的使各个域名、各个ip、各个(四层)端口号,相互配合。在升级各种部署的时候很方便。其它功能也很多。
virtualenv更是必须使用的。
有些朋友刚开始搞不清virtualenv在哪一步的时候,启用。一个原则:凡是pip安装的东西,都在virtualenv下安装。
比如:flask、mysql-python、gunicorn都在virtualenv下安装。
比如:nginx、mysql-server 、libmysqlclient-dev 、libmysqld-dev 、mysql-client等都是apt安装的,就不在virtualenv环境下安装。
有些朋友会问,为什么我用gunicorn,而不是uwsgi,或者flup什么的。因为gunicorn简单。
我们用python就是在乎简单和效率,如果搞的复杂和低效,那么就失去用python的初衷了。
2、协程库。
使用协程库,会让flask的速度加快很多。在互联网后端的应用中,这个是必须要使用的。协程库主要有gevent和eventlet。
flask的库很多,一般常要用的有:Flask-Login、Flask-RESTful、Flask-SocketIO、Flask-SQLAlchemy、Flask-Uploads等等。其它的与协程库关系不大。但是这里Flask-SocketIO如果使用的话,和协程库的配合,就会对协程库的选择产生影响。
flask-socketio的官网:https://flask-socketio.readthedocs.io/en/latest/
这里对使用这个库时候,对协程库的选择有专门的论述。
基本意思是,
eventlet是最佳的选项,支持长轮询和WebSocket。
gevent支持长轮询,但要支持WebSocket,目前有两种选择。安装gevent-websocket,或者可以使用带有WebSocket功能的uWSGI Web服务器。
也可以使用基于Werkzeug的Flask开发服务器,但需要注意的是它缺乏性能。仅支持长轮询传输。
对于这个论述,我建议在使用flask-socketio的时候,还是使用gunicorn和eventlet比较合适。
如果开发遇到问题,需要深入研究的时候,还可以看看flask-socketio的基础库engineio的官网:https://python-engineio.readthedocs.io/en/latest/
3、开发模式。
在我的文章《前后端分离、SPA、SEO、SSR怎么选择?》中,我讲了这个话题。对于flask开发来说,如果用前后端分离,不考虑seo,那么Flask-RESTful就是开发神器,用它就可以了。这个时候,就不使用jinja2模板、web表单这些东西了。前端的东西交给纯前端做。用什么前端技术、或者前端框架,flask后端不用关心。