简介

python能够做很多事件,尽管它的强项在于进行向量运算和机器学习、深度学习等方面。然而在某些时候,咱们依然须要应用python对外提供web服务。

比方咱们当初有一个用python写好的模型算法,这个模型算法须要接管前端的输出,而后进行模仿运算,最终失去最初的输入。这个流程是一个典型的web服务,与其咱们应用java或者nodejs来搭建一个web服务器,不如咱们就应用python本人的web框架来实现这一指标,缩小技术栈的同时,还能够实现代码逻辑的对立,何乐而不为呢?

其实python的web框架也有很多种,比方django、flask等等。

这本系列的文章中,咱们会介绍flask这个轻量级的web框架。

web框架的重要组成部分

置信大家都用过不少web框架吧,从java的spring MVC,到nodejs的express和koa,有性能简单的,也有性能简略的。

然而不论他们的性能如何,其最重要最根本的一个性能就是可能提供web服务,也就是说能够接管HTTP或者HTTPS的申请,而后返回对应的数据。这个性能通常蕴含的是外围的路由跳转性能。

有了这个外围的性能,web框架基本上就能够失常运行了。配合上当初风行的前后端拆散技术,所有瓜熟蒂落。

如果不想用前后端拆散,那么web框架还须要波及到页面的出现技术。一般来说都会应用模板引擎作为前端页面的出现模式。

而后配合上对数据库、缓存、音讯队列、动态资源、日志、调试等附加的性能,一个残缺的web框架就实现了。

flask尽管是一个轻量级web框架,然而该有的性能它全都有。

它的外围是提供了对web路由的反对,同时反对Jinja的模板语言。

疾速上手flask

flask是一个非常简单优雅的web框架,flask须要Python 3.7及以上版本的反对。

为了辨别python的不同开发环境,咱们在应用flask的时候,能够应用python自带的venv来创立不同的虚拟环境。venv跟conda的env很相似,都是用来创立虚拟环境,从而实现不同的环境进行拆散的作用。

应用venv非常简单,如果你用的开发工具是pycharm,那么在创立python的flask我的项目的时候,会主动抉择对应的虚拟环境创立工具,这里咱们抉择应用venv即可主动创立。

当然你也能够应用上面的命令来手动创立venv:

$ mkdir learn-flask$ cd learn-flask$ python3 -m venv venv

创立好venv之后,应用上面的命令来激活这个env:

. venv/bin/activate

venv装置结束之后,咱们能够应用上面的命令装置flask:

pip install Flask

装置结束之后,你能够在python我的项目site-packages外面找到flask对应的依赖包:

能够看到外面出了flask之外,还有其余的一些第三方依赖包,这些都是能够在后续的flask利用中应用到的。

flask的第一个利用

flask的依赖包都装置好之后,咱们就能够写一个最最简略的web应用程序了,咱们把这个应用程序命名为first.py:

from flask import Flaskapp = Flask(__name__)@app.route('/')def first():    return "<p>这是我的第一个flask程序!</p>"if __name__ == '__main__':    app.run()

和一般的python程序不同的是,这里咱们先实例化了一个Flask对象,而后用相似注解的形式定义了一个route在fist这个办法上。

程序写好了,如果你在pycharm IDE中,那么能够右键运行,能够失去上面的内容:

FLASK_APP = first.pyFLASK_ENV = developmentFLASK_DEBUG = 0In folder /Users/data/git/ddean2009/learn-flask/Users/data/git/ddean2009/learn-flask/venv/bin/python -m flask run  * Serving Flask app 'first.py' * Debug mode: offWARNING: This is a development server. Do not use it in a production deployment. Use a production WSGI server instead. * Running on http://127.0.0.1:5000

能够看到IDE为咱们设置了几个环境变量,别离是FLASK_APP:示意要运行的app名称。FLASK_ENV:示意当初的运行环境是开发环境还是线上环境。FLASK_DEBUG示意是否是debug模式。

最终咱们能够拜访默认的http://127.0.0.1:5000,能够失去上面的内容:

阐明整个程序运行胜利了。

如果你想通过命令行来执行flask的利用,那么能够用上面的命令:

flask --app first run

留神,这里咱们增加了--app这个参数来指定要运行的app名称。如果不指定的话,flask会去寻找名叫app.py或者wsgi.py的文件。如果你有这两个文件,那么就能够间接应用flask run来运行了。

这里的flask相当于python -m flask。

默认状况下flask的应用程序只能通过本地的浏览器来拜访,如果你想通过近程来拜访的话,能够指定拜访的host,如下所示:

flask run --host=0.0.0.0

到此,咱们的一个根本的最简略的flask web利用就实现了。

什么?你还要理解更多?别急,上面咱们再具体介绍一些web应用程序所必须理解的常识。

flask中的路由

路由也叫Routing,它是web应用程序中的灵魂,通过路由来定义各种URL和拜访门路。

在flask中,能够应用@app.route来对路由进行定义。@app.route相似于注解,能够搁置在python的办法之上。

route中能够定义路由的名称,路由的名称能够跟办法的名称不一样:

@app.route('/test')def test123():    return '我是一个测试'

路由的名称还能够是动静的,能够取一个跟注解办法中参数的名称一样的参数名作为路由的参数用一个尖括号括起来,如下所示:

from markupsafe import escape@app.route('/student/<name>')def what_is_your_name(name):    return f'你的名字是: {escape(name)}'

这里的办法体中咱们调用了python的f函数来对字符串进行格式化,在外部为了避免web输出端的歹意注入,这里援用了markupsafe的escape办法,能够对输出的字符串进行本义,从而防止了歹意的攻打。

除了在门路中指定参数之外,咱们还能够自行指定参数的类型,在flask中门路参数能够设置为上面的几种类型:

类型阐明
string默认类型,能够接管除了/之外的任何字符串
int能够接管正整数
float能够接管正的浮点数
path和string相似,然而能够接管/
uuid接管uuid字符串

比方咱们想传入一个门路,那么能够将其定义为path类型:

@app.route('/path/<path:subpath>')def what_is_your_path(subpath):    return f'你的门路是: {escape(subpath)}'

下面咱们提到了string和path的区别,就在于path能够接管/,而string不能。

那么在flask中/有什么非凡的含意吗?

咱们晓得/是用做门路宰割的,在flask中蕴含/和不蕴含/还是有肯定的区别的。以上面的代码为例:

@app.route('/withslash/')def with_slash():    return '这是带slash的'@app.route('/withoutslash')def with_out_slash():    return '这是不带slash的'

withslash的定义中带了slash后缀,所以不论你拜访/withslash还是/withslash/, 都会被跳转到withslash/

然而因为withoutslash没有带slash,所以你只能拜访/withoutslash,然而不能拜访/withoutslash/,否则你可能失去一个404 “Not Found”谬误。

不同的http办法

默认状况下@app.route对外提供的是GET办法,如果你想对外提供一些不同的http办法,那么能够在@app.route中应用methods:

@app.route('/diffMethod', methods=['GET', 'POST'])def diff_method():    if request.method == 'POST':        return '这是post'    else:        return '这是get'

当然,你还能够应用@app.get或者@app.post把不同办法的申请离开:

@app.get('/getMethod')def get_method():     return '这是get'@app.post('/postMethod')def post_method():     return '这是post'

动态文件

web利用中少不了的是一些动态资源,比方图片,js或者css等。这些动态资源能够看做是一种非凡的路由规定。在flask中,能够通过创立非凡的static目录来达到这一目标。如下所示:

url_for('static', filename='style.css')

这外面咱们用到了url_for这个办法,这个办法实际上是用来构建对应办法的url的,能够举上面的几个例子来对url_for有个深刻的理解。

urL_for的第一个参数是办法名,前面接的是url中定义的变量,如果url中并没有这个变量,那么将会以参数的模式附加在url的前面:

@app.route('/')def index():    return 'index'@app.route('/login')def login():    return 'login'@app.route('/user/<username>')def profile(username):    return f'{username}\'s profile'with app.test_request_context():    print(url_for('index'))    print(url_for('login'))    print(url_for('login', next='/'))    print(url_for('profile', username='John Doe'))

输入的内容如下:

//login/login?next=//user/John%20Doe

应用模板

如果咱们只是用return来返回简略的字符串或者变量,那么必定满足不了古代利用的需要了。

为了实现简单的页面性能,咱们通常会应用模板。flask应用的是Jinja2这个模板语言。

怎么应用模板呢?咱们在返回的时候,能够应用render_template办法:

from flask import render_template@app.route('/template/<name>')def use_template(name=None):    return render_template('hello.html', name=name)

其中hello.html是模板文件的名字,name是模板文件中定义的变量。

总结

以上就是flask的根本应用了,把握到这些内容之后,置信大家曾经能够应用flask做出一个简略的web利用了。