简介

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即可主动创立。

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

当然你也能够运用下面的指令来手动创立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对应的依靠包:

快速上手python的简单web框架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,能够得到下面的内容:

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

阐明整个程序运行成功了。

假如你想经过指令行来履行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运用了。