Flask入坑记录(一) 构建第一个flask应用

为什么是Flask

使用Python开发Web应用程序在框架上一般有两种选择:Django或者Flask。那么两者的区别是什么呢?这里引用超人叔叔的一篇非常形象生动的博客
Flask与Django对比
总的来说,Django包罗万象,你想要的它都帮你打包好,项目搭建好差不多就可以直接撸业务代码;而Flask则短小精悍,有点开局一把刀装备全靠打的意思。
那么,为什么是Flask呢?什么时候应该选Django什么时候应该选Flask?这里就要看应用场景了,Django功能全面,你想要的它都有,适合构建复杂大型的Web项目,而且对开发人员的水平要求相对没那么高,因为什么逻辑应该放在什么地方,项目的结构已经非常清晰。而Flask的话,开局只有一个基础框架,官方文档的实例也就一个py文件,项目的框架结构需要自行设计或者参考网上大神们的最佳实践,因此Flask项目的灵活性很高,这里就可能会对开发人员的水平有一些要求了,众所周知,越灵活的东西经手的人多了越容易变成“屎山”,Flask适合构建中小型Web应用,而且Flask插件丰富,你想要的功能都能基本上找到插件。

搭建开发环境

既然选择入坑Flask,就要做好折腾的心理准备,因为一个像样的Flask应用肯定是需要很多插件的,所以在安装环境的事情上可能会花很多时间。但是这里我们刚开始入坑,不需要那么多花里胡哨的东西,HelloWorld跑起来再说。
下面是需要用到的东西:

  1. 开发IDE
    这里根据操作系统和个人喜好安装
  2. Python3
    这个的安装就不展开了,安装时需要注意一下环境变量的设置
  3. flask

Windows下
pip install flask
Linux下
pip3 install flask

第一个Flask程序

接下来开始搭建第一个Flask程序,根据国际惯例,先从HelloWorld开始。
run.py

# -*- coding: utf-8 -*-
from flask import Flask
from flask import Response

# Flask app实例
app = Flask(__name__)


# 路由和对应的方法
@app.route('/api', methods=['GET'])
def hello_world():
    body = 'HelloWorld'
    resp = Response(body)
    return resp


def main():
    # 运行在2610端口上并接受所有地址的请求
    app.run(host='0.0.0.0', port=2610)


if __name__ == '__main__':
    main()

寥寥几行,我们就可以搭建一个超精简的Flask应用程序,打开浏览器,访问我们注册的路由。
在这里插入图片描述
上文的代码中有几个需要记录的地方:

  1. 使用@app.route()来装饰方法控制路由
  2. Flask实例生成后再用这个实例的route方法注册路由
  3. 路由方法的回送返回Flask的Response类实现,也可以直接返回字符串

使用蓝图

现在我们的WebApi程序雏形已经有了,但这样是远远不够的,细心的同学应该都发现了,这样写代码是不行的,一点层次结构都没有,项目往后发展肯定会变成“屎山”。开发过WebApi的同学应该都清楚一个WebApi至少要有Controller和Model的概念,直接把路由方法全都写在一个文件里显然是很瓜皮的行为。所以这里需要引入一个蓝图的概念。
蓝图你可以理解为MVC结构中的Controller,也可以理解为是一组功能相近的路由方法。Flask实例可以通过注册蓝图的方法绑定蓝图中的路由方法。换句话说:我们需要把不同的Controller写成不同的蓝图,然后用Flask实例按需注册相应的蓝图。
接下来我们就开始把上例中的路由方法搬家,做成一个像样一点的Controller。

  1. 新建DemoController模块来放我们的路由方法
    DemoController.py
# -*- coding: UTF-8 -*-
from flask import Blueprint
from flask import Response

# 生成蓝图实例
route_demo = Blueprint('api', __name__)

# 路由和对应的方法
@route_demo.route('/hello', methods=['GET'])
def hello_world():
    body = 'HelloWorld'
    resp = Response(body)
    return resp

在蓝图里面写路由方法和上例中是完全一致的,只不过方法中的@app变成了@route_demo,也就是由用Flask实例注册变成用蓝图实例注册。
这里讲解一下生成蓝图实例的这行代码
route_demo = Blueprint('api', __name__)
第一个参数’api’是指该蓝图的名字,作为新入坑小白我们只要知道它是flask运行时内部使用的标识就可以了,flask实例注册的蓝图中不要让它有相同的标识即可。
第二个参数__name__,这个参数决定对应蓝图的是哪个逻辑的 Python 模块或包。如果它指向一个存在的 Python 包,这个包(通常是文件系统中的文件夹)就是资源文件夹。通常都是__name__。
2. Flask实例运行之前注册蓝图
run.py

# -*- coding: utf-8 -*-
from flask import Flask
from flask import Response
from DemoController import route_demo


# Flask app实例
app = Flask(__name__)


def main():
    # 注册DemoController中的route_demo蓝图
    app.register_blueprint(route_demo, url_prefix='/api')
    # 运行在2610端口上并接受所有地址的请求
    app.run(host='0.0.0.0', port=2610)


if __name__ == '__main__':
    main()

在Flask实例运行前调用register_blueprint方法向实例注册我们准备好的蓝图(Controller),并为它指定路由规则。
app.register_blueprint(route_demo, url_prefix='/api')
代码中的第一个参数是要注册的蓝图
代码中的第二个参数是访问这个Controller的路由规则,上例中的/api是指,我们要这样才能访问到这个Controller的方法

http://{address}/api

如我们要访问蓝图中的hello_world方法

http://{address}/api/hello

除此之外还可以设置Controller的静态资源文件夹等,有兴趣的同学可以去翻翻官方的文档。这里作为小白入坑就到此为止。
用蓝图实现模块化的应用

下节内容

到此为止,我们的项目结构已经变成了这个样子。
在这里插入图片描述
这才一个Controller而已,还没加上Model层,还没连上数据库,如果全部都往一个文件夹丢,那项目的结构肯定会惨不忍睹,毫无逻辑层次。所以下节将深入踩下flask的坑,以强迫症视角来整理Flask的项目结构。

参考资源

  1. Flask与Django对比
  2. 用蓝图实现模块化的应用
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值