爱测未来开发-Flask:从Hello World到大型应用 (一)

来源:互联网 发布:哪里有学淘宝拍摄的 编辑:程序博客网 时间:2024/06/05 09:35

在python web框架的世界里充满了选择,有Django,Flask, Tornado,Bottle,web.py等等。这么多框架给了开发者多种选择,可也给选择困难症们带来了麻烦,估计大家在开发自己的项目时都会面临选择框架的问题,我们在做这个平台开发时同样也面临这个问题。最终选择了维持原框架,新内容使用Flask这个框架的方案,今天就简要介绍一下Flask这个框架。

一、简介

       Flask,一个“微”型的python web框架。“微”不是说所有的代码全在一个文件,也是说它内力不足做不了大型项目,而是说它核心简单和易于扩展。它不会替你做出过多决策——比如使用何种数据库,而那些 Flask 所选择的——比如使用何种模板引擎则很容易替换。

——引自flask中文文档。

“Talk is cheap!” 


二、Hello World


套路的话不多说,直接来干货。作为一个微型框架,它没有像Django-admin那样的工程生成工具,因为,它根本就不需要。


上面就是flask版的Hello World,就一个python文件,不足10行,包含路由、视图、Server等各方面,就是这么简单。


三、大型应用版HelloWorld


“微”不代表着不能用于大型项目。Flask官方给出了大型web应用的Flask结构。 这里就用大型应用的结构重构一下Hello World。(小编注:大型项目的结构,可以使用第三方扩展来生成,当然自己造轮子也是可以的。)

这里直接来最后的目录结构。


文件内容如下(没有展示的为空):


展示完,详细的讲解一哈:

问:为什么要用到python的包管理代码,而不是几个文件(模块)放到一起?

答:一个原因,大型项目使用包管理代码相对模块来说,便捷,这个原因很鸡肋,并不是这里必须使用包管理的原因,实际上由于flask的应用是从Flask这个类实例出来的,所有的路由绑定抑或其他设置必须对一个Flask实例操作,为了维持单例(如果对设计模式感兴趣,可以自行扩展),这里使用最简单的一种办法——引用变量,而模块式的管理会因为循环引用的问题导致不能运行。

问:如果不想使用装饰器这种路由设置形式,能不能实现路由和视图函数的分离?

答:小编写过django,django里的路由和视图是分开的,单独写在一个urls.py文件中,个人感觉django的这种组织方式更加便于管理。flask中也是可以使用那种样式,flask提供add_rule这个api,形如

add_url_rule(ruleendpoint=Noneview_func=None**options)

这样,我们的Hello World就变成了这样(没有展示的未变动),




四、模块化的Hello World

首先为什么要模块化?其实这种场景很常见,举个简单的例子,比如你写了一个HelloWorld1,别人写了一个HelloWorld2,现在你想在你的HelloWorld1中嵌入HelloWorld2,但是由于只能有一个Flask实例(原因上面已经说过),你还要修改HelloWorld2的路由来适应你的HelloWorld1,这个修改的过程很是麻烦。为了省去这个麻烦,就需要写的应用模块化,这样只需要一个简单的import就能使用。

Flask提供了这样的功能,blueprints,有好多地方翻译成”蓝图“。

我们就用这个 blueprints  把我们的Hello World重写一下。

这里直接贴结果(没有展示的未变动):



这样模块化的Hello World就完成了,启动服务器(运行runserver.py文件)后,访问http://127.0.0.1:5000/hw1 (如果你没有指定了其他域名或地址运行flask应用)。如果你够仔细,你肯定发现了这个地址末尾的hw1 和 代码中的url_prefix="/hw1"  是一致。这就是blueprints 解决路由冲突的一种方式,直接在所有路由的前面加一个前缀,这种方式对于大型项目的构建是很有用的。


五、小结

flask框架虽小,但是还是能用于大型项目的。本篇简单展示了一个hello world从单文件到大型项目结构再到模块化的过程,对flask的结构作了简要的描述和必要的代码示例,之后我们还会对flask的其他方面进行介绍,敬请期待。


公众号:itest_forever


CSDN:http://blog.csdn.NET/itest_2016

QQ群:274166295(爱测未来2群)、610934609(爱测未来3群)