一线Python运维开发带你秒懂Flask框架
相信曾经纠结过这个问题:怎样才能彻底掌握flask?
Flask是一个使用 Python 编写的轻量级 Web 应用框架。其 WSGI 工具箱采用 Werkzeug ,模板引擎则使用 Jinja2 。Flask使用 BSD 授权。
Flask也被称为 “microframework” ,因为它使用简单的核心,用 extension 增加其他功能。Flask没有默认使用的数据库、窗体验证工具。
今天我们邀请到了多年从事Python开发的不动老师,让他为我们带来flask开发的一线实战。
不动:马哥教育Python实战开发讲师团特邀讲师,多年python开发经验,重度flask使用者,当前从事 O2Oweb商城后端开发和运维开发的工作。
分享开始
大家好,下面现在开始分享flask开发,先看下本次分享的内容:
1、Flask Web框架介绍
Flask是微型web框架,框架本身十分精简,微型并不代表其功能弱,核心代码基于Werkzeug, Jinja 2 这两个库,它以插件形式的进行功能扩展,且插件易于安装与使用,并且可以自行开发扩展插件
与其他web框架类似,flask中请求(request),路由(route),响应(response)构成其完整的一个基本http流程。
2、作为入门flask框架非常易于使用
了解其基本结构后,可以迅速进行MVC开发,或者将其当作后端restfulApi来响应数据。
第一步我们先来用虚拟环境安装flask
虚拟环境,将当前运行环境完全与系统的python环境进行隔离,这里我们使用pyenv这个库来进行构建环境
以centos系统为例安装虚拟环境:
1、yum install zlib-devel bzip2 bzip2-devel readline-devel sqlite sqlite-devel openssl-devel
2、curl -L https://raw.githubusercontent.com/yyuu/pyenv-installer/master/bin/pyenv-installer
| bash
配置环境变量, 在 ~/.bash_profile里增加如下内容:
export PATH="~/.pyenv/bin:$PATH“
eval "$(pyenv init -)"
eval "$(pyenv virtualenv-init -)“
第二步 :在生成虚拟环境 激活此pyenv
1、系统中一般自带的python版本是python2.7.10
2、我们自行下载一个python版本是2.7.12
3、使用sohu的镜像源:http://mirrors.sohu.com/python/
找到python版本是2.7.12的包下载到本地
为何需要使用虚拟环境? 因为虚拟环境对于每一个python环境来说是独立开来的,用虚拟环境可以在一台机器上运行多个项目时,每个项目的环境是隔离,不产生依赖。
4、如需其他版本也可以下载对应的版本放到~/.pyenv/cache文件夹下面(cache文件夹假如不存在,自行创建)
5、然后执行 pyenv install 版本号 安装对应的python版本: pyenv install 2.7.12
6、安装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=http://mirrors.aliyun.com/pypi/simple/
trusted-host=http://mirrors.aliyun.com
第五步安装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对此的相关解释: https://www.python.org/dev/peps/pep-0333/
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有一个大体理解之后进行一个简单的应用开发。
一线Python运维开发带你秒懂Flask框架的更多相关文章
- Python自动化运维之30、Flask框架
Flask 官网:http://flask.pocoo.org/ flask是一个基于Python开发并且依赖jinja2模板和Werkzeug WSGI服务的一个微型框架,对于Werkzeug本质是 ...
- python运维开发(二十三)---tornado框架
内容目录: 路由系统 模板引擎 cookie 加密cookie 自定义api 自定义session 自定义form表单验证 异步非阻塞 web聊天室实例 路由系统 路由系统其实就是 url 和 类 的 ...
- 【福吧资源网整理】老男孩-python运维6期 不加密
老男孩-python运维6期 不加密,连夜整理出来分享给大家老男孩的python教程确实不错. 教程目录: 下载地址:http://www.fu83.cn/thread-204-1-1.html
- Python运维开发基础10-函数基础【转】
一,函数的非固定参数 1.1 默认参数 在定义形参的时候,提前给形参赋一个固定的值. #代码演示: def test(x,y=2): #形参里有一个默认参数 print (x) print (y) t ...
- Python运维开发基础09-函数基础【转】
上节作业回顾 #!/usr/bin/env python3 # -*- coding:utf-8 -*- # author:Mr.chen # 实现简单的shell命令sed的替换功能 import ...
- Python运维开发基础08-文件基础【转】
一,文件的其他打开模式 "+"表示可以同时读写某个文件: r+,可读写文件(可读:可写:可追加) w+,写读(不常用) a+,同a(不常用 "U"表示在读取时, ...
- Python运维开发基础07-文件基础【转】
一,文件的基础操作 对文件操作的流程 [x] :打开文件,得到文件句柄并赋值给一个变量 [x] :通过句柄对文件进行操作 [x] :关闭文件 创建初始操作模板文件 [root@localhost sc ...
- Python运维开发基础06-语法基础【转】
上节作业回顾 (讲解+温习120分钟) #!/usr/bin/env python3 # -*- coding:utf-8 -*- # author:Mr.chen # 添加商家入口和用户入口并实现物 ...
- Python运维开发基础05-语法基础【转】
上节作业回顾(讲解+温习90分钟) #!/usr/bin/env python # -*- coding:utf-8 -*- # author:Mr.chen import os,time Tag = ...
随机推荐
- Net锁
Net分布式锁的实现 序言 我晚上有在公司多呆会儿的习惯,所以很多晚上我都是最后一个离开公司的.当然也有一些同事,跟我一样喜欢在公司多搞会儿.这篇文章就要从,去年年末一个多搞会的晚上说起,那是一个夜黑 ...
- Codeforces 444A DZY Loves Physics(图论)
题目链接:Codeforces 444A DZY Loves Physics 题目大意:给出一张图,图中的每一个节点,每条边都有一个权值.如今有从中挑出一张子图,要求子图联通,而且被选中的随意两点.假 ...
- 自定义WPF 窗口样式
原文:自定义WPF 窗口样式 Normal 0 false 7.8 pt 0 2 false false false EN-US ZH-CN X-NONE 自定义 Window 在客户端程序中,经常需 ...
- 使用带ParserContext参数的Xaml.Load方法
原文:使用带ParserContext参数的Xaml.Load方法 如果一段XAML中存在一个标记需要从外部命名空间中解析, 就需要用到ParserContext类, 具体用法如下: Normal ...
- 整了一天,明白一个道理:线程里post数据,即loop.exec+quit,然而这个quit之后,导致无法在线程里建立新的loop.exec,直接就退出了
跟踪到exec的代码里,发现: 无奈,把第二个post移到主线程里去执行了. 如果大家发现有好办法,请告知我.
- 撑持4G LTE网络 OPPO R1S或在美出售
据外媒报导,OPPO R1S踪影近来出如今美国FCC官网上, 将撑持除T-Mobile之外其他运营商的LTE 4G网络.假如音讯事实,外型简洁美丽OPPO R1S将登入北美商场. 音讯称尽管当前还不晓 ...
- C++ CGI开发环境备录
1. 安装apache2: apt-get install apache2 2. 配置用户目录 在/etc/apache2/apache2.conf中配置用户目录 <Directory /hom ...
- 【推荐网站】下载国外网盘+强大的离线下载站—offcloud.com
博主在网上浏览时看到一篇帖子,推荐了一个离线下载网站–offcloud.com,支持上传种子文件.磁力链和几十家网盘的直连下载,厉害了我的哥,这是个啥网站这么666.即使之前咱们写了几篇文章来自建下载 ...
- 【C#】wpf自定义calendar日期选择控件的样式
原文:[C#]wpf自定义calendar日期选择控件的样式 首先上图看下样式 原理 总览 ItemsControl内容的生成 实现 界面的实现 后台ViewModel的实现 首先上图,看下样式 原理 ...
- 百度蜘蛛ip段代表的不同含义
有时候我们在分析百度蜘蛛的时候,会发现很多的ip,这些个ip地址,根据后面的参数可以发现都是百度的.刚学习SEO不久的同学肯定要问:这些ip地址到底代表什么含义,是不是不同的ip地址所代表的含义不一样 ...