当前位置: 首页 > 科技观察

一线Python运维开发带你秒懂Flask框架

时间:2023-03-12 02:57:16 科技观察

相信我也曾为这个问题纠结过:如何彻底掌握flask?Flask是一个用Python编写的轻量级Web应用程序框架。它的WSGI工具包使用Werkzeug,它的模板引擎使用Jinja2。Flask在BSD下获得许可。Flask也被称为“微框架”,因为它使用简单的核心并使用扩展来添加额外的功能。Flask没有默认使用的数据库或表单验证工具。今天我们请来了从事Python开发多年的Fudo先生,为我们带来了Flask开发的一线实战。下面分享一下flask的发展历程。一起来看看本次分享的内容吧:一、FlaskWeb框架介绍Flask是一个微型的web框架。框架本身非常精简。微不代表弱。核心代码基于Werkzeug,Jinja2这两个库,以插件的形式扩展功能,插件安装使用方便,可以自行开发扩展插件。与其他web框架类似,请求(request)、路由(route)、响应(response)构成了它完整的基本http流程。2.作为入门级的flask框架,非常好用。了解其基本结构后,可以快速开发MVC,或者将其作为后端restfulAPI来响应数据。第一步:我们先安装flask虚拟环境,用虚拟环境将当前运行环境与系统的python环境完全隔离开来。这里我们使用pyenv库来搭建环境。以centos系统为例安装虚拟环境:1、yuminstallzlib-develbzip2bzip2-develreadline-develsqlitesqlite-developenssl-devel2,curl-Lhttps://raw.githubusercontent.com/yyuu/pyenv-安装程序/master/bin/pyenv-安装程序|bash配置环境变量,在~/.bash_profile中添加如下内容:exportPATH="~/.pyenv/bin:$PATH"eval"$(pyenvinit-)"eval"$(pyenvvirtualenv-init-)"第二步:在生成虚拟环境激活这个pyenv1。系统自带的python版本一般是python2.7.102。我们下载了2.7.123的python版本。使用搜狐的镜像源:http://mirrors.sohu.com/python/找python版本为什么我在本地下载2.7.12包时需要使用虚拟环境?因为虚拟环境对于每一个python环境都是独立的,当使用虚拟环境在一台机器上运行多个项目时,每个项目的环境都是隔离的,不会产生依赖关系。4.如果需要其他版本,也可以下载对应的版本放在~/.pyenv/cache文件夹下(如果cache文件夹不存在,自行创建)5.然后执行pyenvinstall版本号安装对应的python版本:pyenvinstall2.7.126。2.7.12版本安装成功后,创建一个目录作为完全隔离的python虚拟环境:pyenvvirtualenv2.7.12venv27mkdir-pvvirtucdvirtupyenvlocalvenv27cd..cdvirtu自动激活venv27环境第三步:安装pipPip是一个工具用于安装python第三方库sudoyum-yinstallepel-release(安装yum包扩展)sudoyum–yinstallpip使用阿里云的python包加速pip安装pip配置阿里云镜像:mkdir~/.pipvim~/.pip/pip.conf,输入以下内容[global]index-url=http://mirrors.aliyun.com/pypi/simple/trusted-host=mirrors.aliyun.com第四步:安装flask:cdvnvn27(刚刚搭建的虚拟环境,切换到完整的虚拟环境)pipinstallflaskpipfreeze列出当前安装的第三方python库和版本运行python终端,导入flask,可以测试flask是否安装成功2.0:wsgi规范Python使用wsgi网关进行web开发。Flask基于wsgi网关。flask中实例的app也称为wsgi应用。wsgi是用python定义的网关协议规范。pep333的相关解释:https://www.python.org/dev/peps/pep-0333/fromwsgiref.simple_serverimportmake_serverwsgiref包是实现wsgi标准的参考。我们可以用它来调试。该包一般用于测试环境,不推荐用于生产环境。使用。simple_server实现了一个简单的http服务器,我们可以用它来运行一个wsgi应用2.1:wsgispecification2下面的例子我们可以使用wsgiref包来实现一个简单的wsgiwebframework来理解它的工作流程:2.2:wsgispecification3在上面代码中,我们使用wsgiref包简单的实现了一个wsgiweb框架,在这个框架中我们从传入的env中获取url后缀来匹配router字典中对应的处理函数。Env参数包含客户端请求的信息和服务。可以在终端打印出环境信息,看看里面包含的变量。start_response函数作为参数传入runserver应用,必须要求start_response(status,header)响应,这是gateway接口定义的函数。从上面可以看出wsgi的作用是web服务器和web应用之间的桥梁。Web服务器监听并将客户端请求转发给wsgi规范接口的实现进行处理,wsgi再将请求转发给上层Web应用进行处理。Web应用程序完成并产生一个响应并返回给wsgi接口,然后Web服务器将收到的响应返回给客户端。2.3:最基本的应用Flask框架也是按照上述规范实现的web框架。我们可以看看flask源码中的上述封装,但是它做了更高层次的抽象。可以看到flask源码使用了wsgi_app,魔术方法__call__封装了上面的start_respons。接下来用flask运行一个hellowordl2.4:一个基本的应用分析'if__name__=='__main__':app.run()pythonhello.py2.5:最基本的应用app=Flask(__name__)代码使用Flask类生成应用实例@app.route('/')defindex():return'

helloworld

'客户端传来一个HTTP处理请求,HTTP服务器(nginx、Apache)再次将请求转发给flask应用实例app,url映射到@中app.route('/)一个链接和一个python函数的对应关系,我们把索引函数称为视图函数。比如访问192.168.1.19---》app.route('/')访问192.168.1.19/blog---》app.route('/blog')2.6:可变url一般业务中,url是动态可变的,在flask中我们设置变量url@app.route('/hello/')defhello(name):return'

hello{}'.format(name)示例:访问192.168.1.19/hello/jack访问192.168.1.19/hello/rose尖括号包围的部分代表python处理函数对应的url的可变部分。以下三种常用来定义变量类型,,2.7:variableurlcustomchanger定义变量url,除了上面的string,还有以下类型的int,float,path三种,另外,flask还可以通过werkzeug中的BaseConverter类自定义转换器。这是一个自定义转换器fromwerkzeug.routingimportBaseConverterclassListConverter(BaseConverter):defto_python(self,value):returnvalue.split('+')defto_url(self,values):return'+'.join(BaseConverter.to_url(value)forvalueinvalues)添加应用程序url_map的自定义转换器。客户端输入参数时,可以用我们自己设置的分隔符进行转换。app.url_map.converters['list']=ListConverter@app.route('/home/')defhome(subs):#Usecustomtypehtm=''forsubinsubs:htm+='

{}

'.format(sub)returnhtmclienttoinproductionenvironment在服务端,使用python开发应用程序的一般流程如下图所示:flask中的request,request是最重要的特性之一在webdevelopment3.0Flask入口:requestfromflaskimportrequest@app.route('/hi')defhi():name=request.args.get('name')return'

hi{}

'.format(name)access:192.168.1.19/hi?name=mikeflask中的request对象封装了客户端的请求参数,我们可以尝试打印(request.__dict__)查看请求上下文环境变量。request请求对象是一个封装在flask内部的全局对象。该对象是线程隔离的,必须在当前请求的上下文中运行。如果直接运行会报错。通过werkzeug模块中的localproxy,在localstack的数据结构中找到当前请求的公共请求客户端变量request.args获取客户端url传过来的查询字符串request.form获取客户端formrequest提交的信息.json从请求体中获取客户端获取的json字符串request.method获取客户端使用的请求方法Request.files获取客户端请求的文件3.1Flask入门:Response和session客户端响应,返回httpheader信息,状态码等,resp=make_respone('hello'.encode()),resp.set_cookie('name','jack'),返回resp,可以手动灵活添加cookiesession分为两种形式:客户端和服务器。Fromflaskimportsession封装了基于客户端的cookie。示例如下:flask的默认配置和我们项目中编写的配置变量都保存在app.config对象中,通常在某些情况下,flask中的一些配置如下4.1flask中读入配置app=Flask(__name__)app.config.from_object('yourapplication.default_settings')app.config.from_pyfile('config.cfg')上面两个都可以在app应用中添加配置文件,其中app.config.from_object()方法会查找配置文件作为类的配置,并将配置文件以功能包配置文件的形式写入app中,这样可以根据参数区分开发环境和生产环境的配置文件4.2工厂方法创建app什么是工厂方法?工厂方法是一种设计模式。这里的使用可以简单理解为通过一个函数批量创建一个flaskapp对象,根据不同的参数生成不同的app。4.3为什么需要创建工厂方法?应用程序?当需要运行app时,可以通过工厂方法传递参数,生成不同的app对象,方便测试不同的app,生成多个app时,可以分别进行请求处理和流量加载,通过下面的Example说明5.0钩子函数flask中钩子函数的作用是将装饰后的函数注册到app中,并在不同的阶段执行。app.first_request:在第一次请求之前执行app.before_request:在每次请求之前执行,可以用它来封装中间键,效果类似于djangomiddlewareapp.after_request:在每次请求之后执行app.teardown_appcontext:无论是否有是异常,每次请求后都会执行app.errorhandler:接受状态码,自定义返回错误处理信息页面5.1钩子函数before_request5.2钩子函数errorhandler5.3蓝图蓝图将应用模块化,很方便不同功能和路线区分,易于维护。蓝图是根据相同的url前缀来区分的。将具有相似功能的视图功能组合在一起作为蓝图的组件来划分应用程序,大大简化了大型应用程序的复杂性。蓝图必须注册在app对象中,蓝图的使用和app的使用非常相似。蓝图提供模板Filters、静态文件、模板等功能5.4蓝图生成将相似的用户功能划分到一个蓝图模块中。注意蓝图文件不能和蓝图对象重名,否则会报冲突。5.5蓝图注册v上述用户实例化时,必须在app应用中注册这个,蓝图才能生效。url_prefix是自定义添加的url后缀。6.0flask扩展使用vflask以插件的形式开发扩展功能。很多优秀的第三方插件可以直接使用,提高开发效率。常用项目开发可用的插件有flask_sqlachemy、flask_redis、flask_login、flask_admin等v插件安装一般使用pipinstall<插件名称>安装v下面的例子使用flask_sqlachemy,flask_sqlachemy是一个flask插件sqlalchemy的,而sqlalchemy是python界知名的工业级ormFramework6.1flask_sqlalchemyv实例化flask_sqlalchemy,生成db对象然后初始化到app中6.2flask插件initializationv由于db对象需要读取里面的配置app应用并依赖于app上下文来工作,上面提到的db对象和其他扩展插件都是初始化到app的,在每个app启动前完成绑定。6.3flask_sqlalchemy使用上面的db对象定义model,model字段继承db.Model。在MVC中,这代表模型层,用于数据库表字段映射和数据写入和保存。6.4flask_sqlalchemy供用户验证以上介绍了flask入门级开发的常见问题和模块的使用。欢迎拍砖。使用Flask轻松开发应用。每个Web框架都有自己的优点和缺点。针对现代web开发的需求,微框架非常适合快速迭代开发。最好的理解方式就是实践,可以基于以上对flask的大致了解后,进行一个简单的应用开发。