关于python:快速上手python的简单web框架flask

4次阅读

共计 4794 个字符,预计需要花费 12 分钟才能阅读完成。

简介

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 Flask

app = Flask(__name__)

@app.route('/')
def first():
    return "<p> 这是我的第一个 flask 程序!</p>"

if __name__ == '__main__':
    app.run()

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

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

FLASK_APP = first.py
FLASK_ENV = development
FLASK_DEBUG = 0
In 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: off
WARNING: 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 利用了。

正文完
 0