快速上手flask,一个简单的Python Web框架
Python可以做很多事情,虽然它的强项在于向量运算、机器学习、深度学习等。但在某些时候,我们仍然需要使用Python来提供向外界提供网络服务。
例如,我们现在有一个用Python编写的模型算法。这个模型算法需要接受输入的输入,然后进行模拟运算,最后得到最终的输出。这个过程就是一个典型的Web服务。我们可以使用Python自己的Web框架来实现这一点,而不是使用java或nodejs来创建Web服务器。通过减少技术栈,我们还可以实现代码逻辑的统一。为什么不这样做呢?
其实Python Web框架有很多种,比如django、flask等。
在本系列文章中,我们将介绍flask这个轻量级的Web框架。
Web框架的重要组件
相信大家都用过很多Web框架,从spring MVC Java到nodejsexpress、koa,有的功能复杂,有的功能简单。
不管它们的功能是什么,它们最重要、最基础的功能之一就是提供Web服务,这意味着它们可以接收HTTP或HTTPS请求,然后返回相应的数据。该功能通常包含内核路由跳转功能。
有了这个基本功能,Web框架就基本可以正常运行了。有了现在流行的前后端分离技术,一切就水到渠成了。
如果不想前后端分离,那么Web框架还必须包含页面渲染技术。一般来说,模板工具作为前端页面的呈现形式。
然后加上数据库、缓存、消息队列、静态资源、日志、调试等其他功能,一个完整的Web框架就完成了。
尽管 Flask 是一个轻量级的 Web 框架,但它拥有它应有的所有功能。
其核心是提供Web路由支持,支持Jinja模板语言。
快速开始使用flask
flask是一个非常简单而优雅的Web框架。 Flask 需要支持 Python 3.7 及更高版本。
使用flask时为了区分不同的python开发环境,我们可以使用python自带的venv来创建不同的虚拟环境。 Venv 与 conda 的 env 非常相似。两者都是用来创建虚拟环境来分隔不同的环境。
外部使用非常简单。如果你使用的开发工具是pycharm,那么当你创建pythonflask项目时,会自动选择对应的虚拟环境工具。这里我们选择使用venv自动创建。
当然,你也可以使用以下命令手动创建venv:
$ mkdir learn-flask $ cd learn-flask $ python3 -m venv venv
创建venv后,使用以下命令激活env:
. venv/bin/activate
安装好venv后,我们可以使用以下命令安装flask:
pip install Flask
安装完成后,可以在python项目web包中找到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对象,然后使用类似注释方法的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:表示运行应用程序名称。 FLASK_ENV:表示当前运行环境是开发环境还是线上环境。 FLASK_DEBUG 表示是否处于调试模式。
最后我们可以访问默认的http://127.0.0.1:5000,得到如下内容:
则说明整个程序成功了。
如果你想通过命令行运行flask应用程序,可以使用以下命令:
flask --app first run
注意,我们在这里添加了--app参数来指定要运行的应用程序的名称。如果未指定,flask 将查找名为 app.py 或 wsgi.py 的文件。如果你有这两个文件,可以直接用flask run运行。
这里的flask相当于python -m Flask。
默认情况下,Flask 应用程序只能通过本地浏览器访问。如果要远程访问,可以指定要访问的主机,如下所示:
flask run --host=0.0.0.0
至此,我们的一个基本的Simple Flask Web应用程序就完成了。
什么?想知道更多?别担心,下面我们将详细介绍一些您需要了解的Web应用知识。
Flask 中的路由
路由也称为路由。它是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)}'
在方法体中,这里我们调用f python 函数来格式化字符串。在内部,为了防止 Web 输入的恶意嵌入,这里引用了 markupsafe。 escape方法可以对输入字符串进行转义,防止恶意攻击。
除了在路径中输入参数外,我们还可以自己确定参数的类型。在flask中,路径参数可以设置为以下类型:
Type | Description |
---|---|
string | 默认类型,可以接受除/之外的任何字符串 |
int❀可以接受正数float | 可以接受正浮点数 |
path | 与string类似,但是可以接受/ |
uuid | 例如接受字符串uuid路径,我们可以将其定义为路径类型: @app.route('/path/<path:subpath>') def what_is_your_path(subpath): return f'你的路径是: {escape(subpath)}' 我们上面提到过,字符串和路径的区别在于路径可以接受 / 而字符串不能。 那么/在烧瓶里有什么特殊的含义吗? 我们知道/用于路径分割。烧瓶中含有 / 和不含有 / 之间存在一些差异。以下面的代码为例: @app.route('/withslash/') def with_slash(): return '这是带slash的' @app.route('/withoutslash') def with_out_slash(): return '这是不带slash的' with斜杠定义了斜杠后缀,因此无论您访问 但由于无斜杠不带斜杠,所以只能访问 默认情况下,@app.route向外界提供GET方法。如果你想对外提供不同的http方法,可以使用@app.route中的方法: 当然,你也可以使用@app.get或@app.post来分隔不同方法的请求: 在Web应用中,一些静态资源是必不可少的,比如图片、js或者css等,这些静态资源可以看作是一种特殊的路由规则。在 Flask 中,这可以通过创建一个特殊的静态目录来实现。如下图: 这里我们使用url_for方法。这个方法实际上是用来创建对应方法的URL。要深入理解url_for函数,可以参考以下示例。 urL_for 的第一个参数是方法的名称,后面是 url 中定义的变量。如果url中没有这个变量,就会以参数的形式附加在url的末尾: 输出内容是这样的: 如果我们只使用return返回一个简单的字符串或变量,肯定不能满足现代应用程序的需求。 我们通常使用模板来实现复杂的网站功能。 Flask 使用 Jinja2 模板语言。 如何使用模板?当我们返回时,我们可以使用render_template方法: 其中hello.html是模板文件的名称,name是模板文件中定义的变量。 以上就是烧瓶的基本使用方法。掌握了这些内容后,相信你已经可以使用flask创建一个简单的Web应用了。 |
版权声明
本文仅代表作者观点,不代表Code前端网立场。
本文系作者Code前端网发表,如需转载,请注明页面地址。
发表评论:
◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。