flask开发的一些经验(一)

作者:清一

类别:flask   

发布时间:2019/02/09 16:16:10   更新时间:2019/06/20 11:50:02


        用flask开发过一些嵌入式设备的维护页面,也开发过网站。总体来说,flask开发嵌入式设备的bs操作维护产品的后端很方便,优点大于缺点;但开发一个网站,缺点大于优点。这个话题,在另一篇文章《django和flask的选择》里讲过了,这个系列的文章只谈些经验。

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后端不用关心。


本文属于原创文章,未经许可,任何媒体、公司或个人不得刊发或转载。

本文网址:https://www.pyfield.com/blog/?id=3