为了账号安全,请及时绑定邮箱和手机立即绑定

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

标签:
Python

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

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

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

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

分享开始

大家好,下面现在开始分享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=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,示例如下:

我有几张阿里云幸运券分享给你,用券购买或者升级阿里云相应产品会有特惠惊喜哦!把想要买的产品的幸运券都领走吧!快下手,马上就要抢光了。
https://promotion.aliyun.com/ntms/act/ambassador/sharetouser.html?userCode=n7gh3gne&utm_source=n7gh3gne

在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()方法会寻找配置文件为类的配置

点击查看更多内容
TA 点赞

若觉得本文不错,就分享一下吧!

评论

作者其他优质文章

正在加载中
  • 推荐
  • 评论
  • 收藏
  • 共同学习,写下你的评论
感谢您的支持,我会继续努力的~
扫码打赏,你说多少就多少
赞赏金额会直接到老师账户
支付方式
打开微信扫一扫,即可进行扫码打赏哦
今天注册有机会得

100积分直接送

付费专栏免费学

大额优惠券免费领

立即参与 放弃机会
意见反馈 帮助中心 APP下载
官方微信

举报

0/150
提交
取消