python之flask

python之flask

环境安装

virtualenv

安装virtualenv的一个好处呢就是环境隔离,类似于docker的集装箱概念吧,因为python会有很多扩展组件,组件的版本有很复杂,所以一套互相隔离的环境就相当重要了

安装教程

安装

1
pip install virtualenv

查看是否安装成功

1
pip list

创建虚拟环境

1
virtualenv envname   # 创建一个名字为envname的虚拟环境

指定用哪个python版本创建环境

1
virtualenv -p c:\Python27\Python.exe envname  # 如果安装了多个python版本,如py2和py3,需要指定使用哪个创建虚拟环境

启动虚拟环境

1
2
3
4
5
6
7
# 进入虚拟环境文件
cd envname
# 进入相关的启动文件夹
cd Scripts

activate # 启动虚拟环境
deactivate # 退出虚拟环境

到此一个虚拟空间就完成了,现在就可以使用这个虚拟环境了。

使用Pycharm和virtualenv创建一个flask项目

首先随便建一个文件夹用来存放我们的代码

01

新建项目

02

选择我们的项目地址,以及新建的virtualenv空间和virtualenv指定的python解析器,点击create创建完成。

hello word

03

一个hello word就好了

requirements.txt

1
pip freeze requirements.txt

使用该指令将我们项目所需要的依赖输出到requirements文件中,下次部署环境时直接

1
pip install requirements.txt

04

可以看到这个requirements.txt包含了我们虚拟空间的依赖以及版本号,并没有其他空间的依赖项。

上代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
# 导入flask扩展
from flask import Flask

# 创建flask应用实例,需要传入__name__,作用是为了确定资源所在的路径
app = Flask(__name__)


@app.route('/')
def hello_world(): # put application's code here
return 'Hello World!'

# 定义路由和视图函数 flask中定义路由通过装饰器来实现的
@app.route('/he')
def a():
return "hi!"

# 启动程序 执行了app.run就会把我们的flask程序运行在一个建议的服务器上(Flask提供的,用于猜测的)
if __name__ == '__main__':
app.run()

Flask运行过程

  1. 当客户端想要获取资源时,一般会通过浏览器发送一个请求
  2. 此时,通过app.run启动的web服务器会把客户端的所有请求都交给Flask程序实例
  3. 程序使用Werkzeug来做路由分发(URL请求和视图函数之间的对应关系)
  4. 根据URL请求,找到具体的视图函数并进行调用
    • 在Flask程序中,路由的实现一般是通过程序实例的装饰器实现
  5. Flask调用视图函数后,可以返回两种内容:
    • 字符串内容:将视图函数的返回值作为相应的内容,返回给客户端。
    • HTML模板内容:获取到数据后,把数据传入HTML模板文件中,模板引擎负责渲染HTTP响应数据,然后返回响应数据给客户端。

路由传参

有时我们需要将同一URL映射到同一个视图函数处理,比如:使用同一个视图函数来显示不同用户的订单信息。

路由传递的参数默认当作str处理

1
2
3
4
5
6
7
# 使用同一个视图函数,来显示不同的视图信息
# < >定义路由参数
# 这里指定参数为int类型,其他类型的传过来会404,有点类似于Java调用方法要参数类型一直
@app.route('/order/<int:orderId>')
def getOrderId(orderId):
print(type(orderId))
return 'orderId %s' % orderId

这里指定int,会调用系统的路由转换器进行转换和匹配,如果类型没有转换成功就无法匹配该路由

结构化管理

05

这一点很好理解,这是一种思想,分类管理。而不是要把所有的东西都放在一个地方。比如我们写api,新建一个api的包,v1代表版本,然后下面才是我们具体的api文件。

这里的路由不能使用@app.route

06

蓝图需要向app注册,关于app对象的配置统一写在app.py里面。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
def createApp():
app = Flask(__name__)
app.config.from_object('app.config.setting')
app.config.from_object('app.config.secure')
# 调用注册方法实现注册
registerBlueprints(app)
return app


# 定义一个注册的方法
def registerBlueprints(app):
from api.v1.book import book
from api.v1.user import user
app.register_blueprint(user)
app.register_blueprint(book)

实现一个自己的蓝图

蓝图包括哪些功能呢?

  1. 路由
  2. 路由和视图函数的绑定

他是怎么实现的呢,看源代码

1
2
3
4
5
6
7
8
def route(self, roule, **option):
def decorator(f):
# f是当前视图函数,将当前视图函数加入到option中
endpoint = option.pop("endpoint", f.__name__)
# 再给看图添加url规则
self.add_url_rule(rule, edpoint, f, **option)
return f
return decorator

我们自己模仿实现

1
2
3
4
5
6
7
def route(self, rule, **options):
def decorator(f):
# 我们拿不到蓝图,先保存等可以拿到的时候再来处理
self.mount.append((f, rule, options))
return f

return decorator

register

1
2
3
4
5
def register(self, bp, url_prefix=None):
for f, rule, options in self.mount:
# 如果有以endpoint为key的value则取value,否则取视图的名字
endpoint = options.pop("endpoint", f.__name__)
bp.add_url_rule(url_prefix + rule, endpoint, f, **options)

本博客所有文章除特别声明外,均采用 CC BY-SA 4.0 协议 ,转载请注明出处!