Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >一线Python运维开发带你秒懂Flask框架

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

作者头像
小小科
发布于 2018-05-02 10:57:28
发布于 2018-05-02 10:57:28
1.8K0
举报
文章被收录于专栏:北京马哥教育北京马哥教育

相信曾经纠结过这个问题:怎样才能彻底掌握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=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有一个大体理解之后进行一个简单的应用开发。


本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2017-10-25,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 马哥Linux运维 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
HashMap与Hashtable的区别是面试中经常遇到的一个问题。
HashMap与Hashtable的区别是面试中经常遇到的一个问题。这个问题看似简单,但如果深究进去,也能了解到不少知识。本文对两者从来源,特性,算法等多个方面进行对比总结。力争多角度,全方位的展示二者的不同,做到此问题的终结版。
黑泽君
2018/10/11
1.6K0
HashMap与Hashtable的区别是面试中经常遇到的一个问题。
HashMap和HashTable的理解与区别
Hashtable是java一开始发布时就提供的键值映射的数据结构,而HashMap产生于JDK1.2。虽然Hashtable比HashMap出现的早一些,但是现在Hashtable基本上已经被弃用了。而HashMap已经成为应用最为广泛的一种数据类型了。造成这样的原因一方面是因为Hashtable是线程安全的,效率比较低。也可能是Hashtable开始设计的时候没有遵循驼峰命名法(手动笑哭)。
全栈程序员站长
2022/07/22
2250
HashMap和Hashtable的联系与区别
HashMap继承自AbstractMap类,而HashTable继承自Dictionary类。它们都同时实现了Map(图)、Cloneable(可克隆)、Serializable(可序列化)这三个接口。Dictionary类现已被弃用,父类已被弃用,自然没有人使用它的子类Hashtable。
VIBE
2022/12/02
7440
面试必问之HashMap VS HashTable
HashMap和HashTable有什么不同?在面试和被面试的过程中,我问过也被问过这个问题,也见过了不少回答,今天决定写一写自己心目中的理想答案。
技术zhai
2019/02/15
4260
Java中的HashMap和HashTable到底哪不同?
HashMap和HashTable有什么不同?在面试和被面试的过程中,我问过也被问过这个问题,也见过了不少回答,今天决定写一写自己心目中的理想答案。
哲洛不闹
2018/09/18
6920
Java中的HashMap和HashTable到底哪不同?
HashMap常见面试题_java面试题大汇总
大家好,又见面了,我是你们的朋友全栈君。 目录 1.HashMap的数据结构? 2.HashMap的工作原理? 3.当两个对象的hashCode相同会发生什么? 4.你知道hash的实现吗?为什么要这
全栈程序员站长
2022/09/22
3900
HashMap常见面试题_java面试题大汇总
内含扩容源码的面试题,目标是手写HashMap!
    推荐在单线程环境下使用HashMap替代,如果需要多线程使用则用ConcurrentHashMap。
上分如喝水
2021/08/16
3920
内含扩容源码的面试题,目标是手写HashMap!
Java集合详解4:一文读懂HashMap和HashTable的区别以及常见面试题
《Java集合详解系列》是我在完成夯实Java基础篇的系列博客后准备开始写的新系列。
Java技术江湖
2019/10/11
9010
hashmap和hashtable的区别,说法错误的是_javamap的用法
HashMap和Hashtable的区别 一、HashMap简介 HashMap是在JDK1.2中引入的Map的实现类。 1.HashMap是基于哈希表实现的,每一个元素是一个key-value对,其内部通过单链表解决冲突问题,容量不足(超过了阀值)时,同样会自动增长。
全栈程序员站长
2022/10/02
3730
hashmap和hashtable的区别,说法错误的是_javamap的用法
Java集合容器面试题(2020最新版)
Java面试总结汇总,整理了包括Java基础知识,集合容器,并发编程,JVM,常用开源框架Spring,MyBatis,数据库,中间件等,包含了作为一个Java工程师在面试中需要用到或者可能用到的绝大部分知识。欢迎大家阅读,本人见识有限,写的博客难免有错误或者疏忽的地方,还望各位大佬指点,在此表示感激不尽。文章持续更新中…
Java架构师必看
2020/04/10
1.2K0
Hashtable全面使用-Java快速入门教程
Java中的Hashtable类是抽象字典类(Dictionary )的具体实现。
jack.yang
2025/04/05
1120
Hashtable全面使用-Java快速入门教程
轻松看懂Hashtable源码以及与HashMap的区别
上一篇我们认识了什么是Map、Hash,了解了Hash处理哈希冲突的几种常用方法(拉链法、开放定址法),以及分析了JDK1.8版本的HashMap源码,对Java集合框架有了初步的认识,我们本篇继续分析JDK1.8版本的Hashtable源码,最后比较HashMap和Hashtable的区别。
烂猪皮
2019/04/25
4200
轻松看懂Hashtable源码以及与HashMap的区别
HashMap面试题,看这一篇就够了!
在后端的日常开发工作中,集合是使用频率相当高的一个工具,而其中的HashMap,则更是我们用以处理业务逻辑的好帮手,同时HashMap的底层实现和原理,也成了面试题中的常客。
天之痕苏
2019/12/18
1.2K0
HashMap面试题,看这一篇就够了!
聊聊java中的哪些Map:(五)HashTable与HashMap的区别
既然聊到了HashMap,那么HashTable、ConcurrentHashMap等这都是绕不开的话题。做为ConcurrentHashMap在并发场景下高效性能的一个反例,HashTable究竟是怎么实现的呢,本章将对HashTable的源码进行分析。
冬天里的懒猫
2020/08/26
6270
聊聊java中的哪些Map:(五)HashTable与HashMap的区别
面试题:HashMap和HashTable的区别
1、两者父类不同 HashMap是继承自AbstractMap类,而Hashtable是继承自Dictionary类。不过它们都实现了同时实现了map、Cloneable(可复制)、Serializable(可序列化)这三个接口。
向着百万年薪努力的小赵
2022/12/02
1300
HashMap&ConcurrentHashMap&HashTable
JDK1.8以前Hashmap底层是数组和链表结合在一起使用,也就是散列链表。hashmap的key的hashcode()扰动函数处理后得到hash值,然后通过(n-1)& hash 判断当前元素存放的位置,如果当前位置存在元素的话,就判断当前位置存在的元素是否与之相同,相同则直接覆盖,不相同就通过拉链法解决冲突。
Tim在路上
2020/08/04
4310
大厂必问的Java集合面试题
本文已经收录到github仓库,此仓库用于分享互联网大厂高频面试题、Java核心知识总结,包括Java基础、并发、MySQL、Springboot、MyBatis、Redis、RabbitMQ等等,面试必备!欢迎大家star!
程序员大彬
2022/01/06
1.5K0
大厂必问的Java集合面试题
Java集合必会14问(精选面试题整理)
答:通过分析源码我们知道了HashMap通过resize()方法进行扩容或者初始化的操作,下面是对源码进行的一些简单分析:
我没有三颗心脏
2018/08/13
4590
Java集合必会14问(精选面试题整理)
面试常被问到的 Java 集合知识点(详细)
面向对象语言对事物的体现都是以对象的形式,所以为了方便对多个对象的操作,需要将对象进行存储,集合就是存储对象最常用的一种方式,也叫容器。
程序员小猿
2021/01/19
8840
面试常被问到的 Java 集合知识点(详细)
Java 8系列之重新认识HashMap
作者:美团点评技术团队 链接:https://zhuanlan.zhihu.com/p/21673805 来源:知乎 著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
bear_fish
2018/09/19
1.2K0
Java 8系列之重新认识HashMap
推荐阅读
相关推荐
HashMap与Hashtable的区别是面试中经常遇到的一个问题。
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档