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

相信曾经纠结过这个问题:怎样才能完全掌握flask?python

Flask是一个使用 Python 编写的轻量级 Web 应用框架。其 WSGI 工具箱采用 Werkzeug ,模板引擎则使用 Jinja2 。Flask使用 BSD 受权。nginx

 

Flask也被称为 “microframework” ,由于它使用简单的核心,用 extension 增长其余功能。Flask没有默认使用的数据库、窗体验证工具。git

今天咱们邀请到了多年从事Python开发的不动老师,让他为咱们带来flask开发的一线实战。github

 

不动:马哥教育Python实战开发讲师团特邀讲师,多年python开发经验,重度flask使用者,当前从事 O2Oweb商城后端开发和运维开发的工做。web

 

分享开始redis

你们好,下面如今开始分享flask开发,先看下本次分享的内容:sql

一、Flask Web框架介绍数据库

Flask是微型web框架,框架自己十分精简,微型并不表明其功能弱,核心代码基于Werkzeug, Jinja 2 这两个库,它以插件形式的进行功能扩展,且插件易于安装与使用,而且能够自行开发扩展插件django

与其余web框架相似,flask中请求(request),路由(route),响应(response)构成其完整的一个基本http流程。json

 

二、做为入门flask框架很是易于使用

了解其基本结构后,能够迅速进行MVC开发,或者将其看成后端restfulApi来响应数据。

 

第一步咱们先来用虚拟环境安装flask

虚拟环境,将当前运行环境彻底与系统的python环境进行隔离,这里咱们使用pyenv这个库来进行构建环境

以centos系统为例安装虚拟环境:

一、yum install zlib-devel bzip2 bzip2-devel readline-devel sqlite sqlite-devel openssl-devel
二、curl -L   
| bash

配置环境变量, 在 ~/.bash_profile里增长以下内容:

export PATH="~/.pyenv/bin:$PATH“
eval "$(pyenv init -)" 
eval "$(pyenv virtualenv-init -)“

第二步 :在生成虚拟环境 激活此pyenv

 

一、系统中通常自带的python版本是python2.7.10


二、咱们自行下载一个python版本是2.7.12


三、使用sohu的镜像源: 
找到python版本是2.7.12的包下载到本地

为什么须要使用虚拟环境? 由于虚拟环境对于每个python环境来讲是独立开来的,用虚拟环境能够在一台机器上运行多个项目时,每一个项目的环境是隔离,不产生依赖。

 

四、如需其余版本也能够下载对应的版本放到~/.pyenv/cache文件夹下面(cache文件夹假如不存在,自行建立)

 

五、而后执行 pyenv install 版本号 安装对应的python版本: pyenv install 2.7.12

 

六、安装2.7.12版本成功后,建立一个目录为彻底隔离的python虚拟环境:

pyenv virtualenv 2.7.12 venv27

mkdir -pv virtu

cd virtu pyenv local venv27 cd .. cd virtu 自动激活了venv27环境

第三步 安装pip

Pip是一个用来安装python第三方库的工具

sudo yum -y install epel-release (安装yum包扩展)

sudo yum –y install pip

使用阿里云的python包加速pip安装

Pip 配置阿里云镜像:
mkdir ~/.pip
vim ~/.pip/pip.conf, 输入如下内容
[global] index-url= 
trusted-host= 

第五步安装flask:

cd vnvn27 (刚才构建的虚拟环境,切换到了一个彻底虚拟环境)

Pip install flask

Pip freeze 列出当前安装的第三方python库以及版本

运行python终端,import flask,能够测试是否安装flask成功

 

2.0:wsgi规范

Python使用wsgi网关进行Web开发,flask基于wsgi网关,flask中实例的app,也称之为一个wsgi 应用
Wsgi是python中定义的一种网关协议规范,pep333对此的相关解释: 

from wsgiref.simple_server import make_server

wsgiref包是实现了wsgi标准的一个参考,咱们能够用它来进行调试,此包通常用于测试环境,不建议生产环境中使用。
simple_server实现了一个简易的http服务器,咱们能够用它来运行一个wsgi应用

 

2.1:wsgi规范2

下面示例咱们能够用wsgiref这个包实现一个简单的wsgi web框架来理解其工做流程:

 

 

2.2:wsgi规范3

上面的代码中,咱们使用了wsgiref包简易的实现了一个wsgiweb框架,其中咱们依据传入的env中获取到url后缀来匹配router字典中对应的处理函数

Env参数是包含了客户端请求的信息和服务端的环境信息,能够将其打印出来,看下其中包含的变量。

Start_response函数做为参数传入runserver应用中,必需要start_response(status,header)来进行响应,它是由网关接口定义的函数。
在上述中能够看出,wsgi的做用是在web服务器和web应用之间的桥梁,web服务器监听将客户端请求转发给实现wsgi规范接口处理,wsgi接将请求进行中转给上层的web应用处理,web应用处理完成并生成响应返回给wsgi接口,而后web服务器将收到的响应返回给客户端。

 

2.3:一个最基本应用

Flask框架也是依据上面的规范实现的web框架,咱们能够看下flask源码中对于上述的封装,不过它作了更高层次的抽象

 

 

能够看到flask源码中使用wsgi_app和魔术方法__call__对 上述start_respones作了封装。

接下里用flask运行一个hello wordl

 

2.4:一个最基本应用分析

/usr/bin/env python 
from Flask import flask
app = Flask(__name__)

@app.route('/') 
def index(): 
return ‘<h1>Hello World!</h1>‘
if __name__ == '__main__': 
app.run()
python hello.py

 

2.5:最基本应用

app = Flask(__name__) 代码使用Flask类生成一个应用实例
@app.route('/') 
def index():
return ‘<h1>hello world</h1>’
一个http过程当中请求来自客户端,http服务器(nginx,Apache)再次将请求转发给flask应用实例app,@app.route(‘/)中映射了url连接与一个python函数的对应关系,咱们将index函数称之为视图函数。
好比访问192.168.1.19 

---》app.route(‘/’)
访问192.168.1.19/blog 

---》app.route(‘/blog’)

 

2.6:可变url

在通常业务中,url都是动态可变的,在flask中咱们这样设置可变url

@app.route(‘/hello/<name>’)

def hello(name):

return ‘<h1>hello {}’.format(name)

示例:

访问192.168.1.19/hello/jack

访问192.168.1.19/hello/rose

<name> 被尖括号抱起来的部分表明url中与python处理函数中对应的可变部分.

经常使用的有如下3种,定义可变的类型

<string:name>、<int:uid>、<path:prefix>

 

2.7:可变url自定义装换器

定义可变url,除了上述的string以外,还有如下几种int、float、path这三种,另外flask还能够经过werkzeug中的BaseConverter类,自定义转换器。

这里自定义一个转换器

 

fromwerkzeug.routing import BaseConverter

classListConverter(BaseConverter):

def to_python(self, value):

return value.split('+')

def to_url(self, values):

return'+'.join(BaseConverter.to_url(value) for value in values)

将自定义转换器加入到app应用url_map中,当客户端输入参数时,能够以,咱们自行设置的分隔符作转换
app.url_map.converters['list'] = ListConverter
@app.route('/home/<list:subs>')
def home(subs):
# 使用自定义类型
htm = ''
for sub in subs:
htm += '<h1>{}</h1>'.format(sub)
return htm

在生产环境中客户端到服务端,使用python开发应用的通常流程是以下图所示:

 

 

flask中的请求,请求是web开发中最重要特性之一

 

3.0 Flask入门:请求

from flask import request
@app.route(‘/hi’)
def hi():
name = request.args.get(‘name’)
return ‘<h1>hi {}</h1>’.format(name)
访问:
192.168.1.19/hi?name=mike 

flask中request对象封装了客户端的请求参数
咱们能够尝试将print(request.__dict__)查看请求上下文环境变量

request请求对象是flask内部封装的一个全局对象,这个对象是线程隔离的,必须运行在当前请求中的上下文,直接运行会报错,它经过werkzeug模块中localproxy在localstack这种数据结构寻找当前请求
常见的request客户端变量
request.args 获取从客户端url传输过来的查询字符串
request.form 获取从客户端表单提交过来的信息
request.json 获取从客户端从请求body获取的json字符串
request.method 获取客户端使用的请求方法 
Request.files 获取从客户端请求过来的文件

 

3.1 Flask入门:响应与会话

from flask import make_respones

flask中封装了make_response做为客户端响应,返回http头信息、状态码等,resp = make_respone(‘hello’.encode()),resp.set_cookie(‘name’, ‘jack’) ,将resp做为返回,能够手动灵活的增长了cookie

会话分为客户端和服务端2种形式,from flask importsession 中封装了基于客户端的cookies,示例以下:

 

 

在app.config对象中保存了flask的默认配置以及咱们项目中写入的配置变量,一般状况下flask中的一些配置以下

 

 

 

 

4.1 flask中的读入配置

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

什么是工厂方法?工厂方法是一种设计模式,这里使用能够简单理解为经过一个函数来批量建立一个flask app对象,依据不一样的参数来生成不一样的app

 

 

4.3为什么须要工厂方法建立app?

当须要运行app的时候,能够经过工厂方法传递参数来生成不一样的app对象,方便的进行测试不一样的app,而且生成多个app的时候能够进行分别进行请求处理,流量负载等,经过如下示例说明

 

 

5.0钩子函数

flask中钩子函数做用是将被装饰的函数注册到app当中,在不一样阶段执行。

app.first_request: 在第一次请求以前执行

app.before_request: 在每次请求以前执行,能够用它来封装中间键,效果相似于django middleware

app.after_request: 在每次请求以后执行

app.teardown_appcontext: 不论是否有异常出现,都会在每次请求以后执行

app.errorhandler:接受状态码,而且自定义返回错误处理信息页面

 

5.1钩子函数before_request

 

 

5.2钩子函数errorhandler

 

 

5.3蓝图

蓝图将应用进行模块化,可以很方便的将不一样的功能和路由区分开,而且易于维护,蓝图基于相同的url前缀来做区分。

功能相似的视图函数组合在一块儿做为蓝图的组件,将应用进行分割,极大简化了大型应用的复杂度,蓝图要注册到app对象中,蓝图的使用方式与app的使用方式很像

蓝图提供模板过滤器、静态文件、模板和其它功能

5.4蓝图生成

将user这些类似的功能分红一个蓝图模块,注意蓝图文件不能和蓝图对象同名,不然会冲突报错

 

 

5.5蓝图注册

v 当以上user实例化时,必须将此注册到app应用中,蓝图才能生效,url_prefix为自定义添加的url后缀

 

 

6.0flask扩展使用

v flask以插件形式开发扩展功能,其中许多优秀第三方插件能够直接使用,提高开发效率,常见项目开发用到的插件有flask_sqlachemy、flask_redis、flask_login、flask_admin等等

v 插件安装通常使用 pip install <插件名>,便可安装

v 如下示例flask_sqlachemy使用,flask_sqlachemy是sqlalchemy的flask插件,sqlalchemy是python界有名的工业级orm框架

 

6.1flask_sqlalchemy

v 实例化flask_sqlalchemy,生成db对象后续初始化到app中

 

 

6.2flask插件初始化

v 因为db对象须要读取app应用中配置,而且依赖app上下文工做,因此将上述db对象等扩展插件初始化app,在每次app启动以前完成绑定

 

 

6.3 flask_sqlalchemy定义model

使用上述db对象,model字段继承db.Model,在mvc中此表示model层,用来进行数据库表字段映射关联以及数据写入保存等.

 

 

6.4 flask_sqlalchemy进行用户验证

 

 

以上介绍了flask中入门开发常见的问题以及模块使用,欢迎你们拍砖。

 

使用flask能够轻松开发应用,每一种web框架都有其自身利弊,对于现代web开发的需求来讲,微框架很适合快速迭代式开发,最好的理解的方法是实践,能够依据以上对flask有一个大致理解以后进行一个简单的应用开发。

相关文章
相关标签/搜索