Code前端首页关于Code前端联系我们

快速上手flask,一个简单的Python Web框架

terry 2年前 (2023-09-24) 阅读数 54 #后端开发

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自动创建。

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项目web包中找到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,得到如下内容:

python简单web框架flask快速上手

则说明整个程序成功了。

如果你想通过命令行运行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斜杠定义了斜杠后缀,因此无论您访问/with斜杠还是/with斜杠/❀,都会被重定向到♽ ❀带斜杠/

但由于无斜杠不带斜杠,所以只能访问/无斜杠,而不能访问/无斜杠/无,否则可能会报错40、

各种http方法

默认情况下,@app.route向外界提供GET方法。如果你想对外提供不同的http方法,可以使用@app.route中的方法:

@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 中,这可以通过创建一个特殊的静态目录来实现。如下图:

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创建一个简单的Web应用了。

版权声明

本文仅代表作者观点,不代表Code前端网立场。
本文系作者Code前端网发表,如需转载,请注明页面地址。

发表评论:

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。

热门