乐趣区

关于python:Python-Flask-快速构建Web应用详解

本文将具体探讨 Python Flask Web 服务。我将首先简略介绍 Flask,而后将逐渐进入 Flask 中的路由、模板、表单解决以及数据库集成等高级概念,指标是可能让大家理解并把握应用 Flask 来创立动静 Web 利用的技巧。

1. Flask 简介

Flask 是一个轻量级的 Web 服务器网关接口(WSGI)web 利用框架。它被设计为易于应用,同时也提供了扩展性,用户能够自在地抉择将其与哪些第三方库集成。Flask 是 ” 微 ” 框架,这意味着其外围性能十分无限,但能够通过一系列的扩大来加强性能。

让咱们来看一下如何创立一个简略的 Flask 利用。

from flask import Flask
app = Flask(__name__)

@app.route('/')
def hello_world():
    return 'Hello, World!'

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

在这段代码中,咱们首先导入 Flask 模块,并创立一个 Flask web 服务器实例。而后,咱们定义了一个路由(route),即/。这个路由映射到一个函数hello_world,当用户拜访这个 URL 时,它会返回 ’Hello, World!’ 字符串。

2. Flask 路由

Flask 通过提供装璜器 app.route,使得定义路由变得简单易行。但你晓得咱们也能够通过app.add_url_rule 办法间接增加路由吗?这种形式提供了更多的灵活性,例如,能够为路由增加不同的 HTTP 办法。

def hello():
    return "Hello, World!"

app.add_url_rule('/', 'hello', hello)

在上述代码中,app.add_url_rule的第一个参数是 URL 规定,第二个参数是函数的别名,第三个参数是要映射的函数。

3. Flask 模板

Flask 应用 jinja2 模板库。这个库十分弱小,能够让你在 HTML 中嵌入 Python 代码。上面的例子展现了如何在 Flask 利用中应用模板:

from flask import render_template

@app.route('/hello/<name>')
def hello(name):
    return render_template('hello.html', name=name)

render_template函数用于渲染一个模板。它接管模板的名称和一些模板变量作为参数,返回生成的 HTML 内容。在模板中,你能够应用 {{name}} 来显示变量的值。

4. Flask 表单解决

Flask-WTF 是 Flask 中用于解决 Web 表单的扩大库。它基于 WTF Python,一个解决表单数据的 Python 库。Flask-WTF 还具备 CSRF(跨站申请伪造)爱护的性能。

让咱们

看一个简略的例子:

from flask import request
from flask_wtf import FlaskForm
from wtforms import StringField

class MyForm(FlaskForm):
    name = StringField('name')

@app.route('/submit', methods=('GET', 'POST'))
def submit():
    form = MyForm()
    if form.validate_on_submit():
        return 'Hello, %s' % form.name.data
    return render_template('submit.html', form=form)

在这个例子中,咱们定义了一个表单类 MyForm,蕴含一个name 字段。而后,咱们在 submit 路由中创立了一个该类的实例,并查看表单是否通过验证。如果表单无效,咱们就返回一条欢送信息;否则,咱们就渲染一个表单模板。

5. Flask 数据库集成

Flask-SQLAlchemy 是一个为 Flask 利用提供 SQLAlchemy 反对的扩大库。SQLAlchemy 是 Python 中的一种 ORM(对象关系映射)工具,能够将类映射到数据库表。

from flask_sqlalchemy import SQLAlchemy

app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:////tmp/test.db'
db = SQLAlchemy(app)

class User(db.Model):
    id = db.Column(db.Integer, primary_key=True)
    username = db.Column(db.String(80), unique=True, nullable=False)

    def __repr__(self):
        return '<User %r>' % self.username

在这个例子中,咱们首先配置数据库的 URL,而后创立一个 SQLAlchemy 实例。接着,咱们定义一个 User 类,这个类继承自 db.Model,并具备两个属性:idusername。这两个属性都是数据库表的列。

6. 应用 Flask 构建 RESTful API

当构建 Web API 时,Flask-RESTful 是一个值得理解的扩大。它为疾速创立 REST API 提供了简略的办法。你能够通过定义 Python 类来实现 API 资源,并将 HTTP 办法(如 GET、POST)映射到类的办法。

from flask_restful import Resource, Api

api = Api(app)

class HelloWorld(Resource):
    def get(self):
        return {'hello': 'world'}

api.add_resource(HelloWorld, '/')

在上述代码中,咱们首先创立了一个 Api 对象,而后定义了一个资源类 HelloWorld,并在这个类中实现了一个get 办法。最初,咱们应用 api.add_resourceHelloWorld类绑定到/ URL。

7. Flask 蓝图

Flask 的蓝图性能让咱们可能组织更大、更简单的应用程序。你能够将蓝图视为 Flask 应用程序的一个子集,它能够领有本人的路由、模板和动态文件。

上面是一个简略的例子:

from flask import Blueprint

simple_page = Blueprint('simple_page', __name__)

@simple_page.route('/<page>')
def show(page):
    return 'Page %s' % page

在这个例子中,咱们首先创立了一个名为 simple_page 的蓝图,而后为这个蓝图定义了一个路由show

8. Flask 错误处理

Flask 容许咱们自定义谬误处理函数,当特定的 HTTP 谬误产生时,咱们能够返回自定义的响应。以下是如何为 404 谬误定义自定义处理函数的示例:

@app.errorhandler(404)
def page_not_found(error):
    return 'This page does not exist', 404

在这个例子中,咱们应用 app.errorhandler 装璜器注册一个新的谬误处理函数。当 404 谬误产生时,它将返回一个自定义的谬误音讯。

9. Flask 申请钩子

Flask 提供了几个装璜器,咱们能够应用它们来注册在解决申请的不同阶段调用的函数。这些装璜器包含 before_first_requestbefore_requestafter_requestteardown_request

@app.before_request
def before_request():
    print("This is executed BEFORE each request.")

在这个例子中,before_request装璜器的函数将在每个申请之前执行。

10. Flask 中的 Cookies 和 Sessions

在 Web 开发中,咱们经常须要存储用户的信息,例如用户的偏好设置或者登录状态。Flask 提供了 Cookies 和 Sessions 两种形式来实现这个工作。

上面是如何在 Flask 中设置和读取 cookie 的例子:

@app.route('/set')
def setcookie():
    resp = make_response('Setting cookie!')
    resp.set_cookie('username', 'the username')
    return resp

@app.route('/get')
def getcookie():
    username = request.cookies.get('username')
    return 'The username is' + username

在上述例子中,setcookie路由设置了一个 cookie,名为 usernamegetcookie 路由读取并返回了这个 cookie 的值。

One more thing

Flask 的测试客户端容许咱们模仿向咱们的利用发送申请,并查看响应。

def test_index():
    client = app.test_client()
    response = client.get('/')
    assert response.status_code == 200

在上述代码中,咱们首先创立了一个测试客户端。而后,咱们应用这个客户端发送一个 GET 申请到/ URL,最初,咱们查看响应的状态码是否为 200。

这只是 Flask 弱小性能的冰山一角,Flask 的魅力远不止于此,它还有许多丰盛的扩大,比方 Flask-Login 用于解决用户认证,Flask-Mail 用于发送邮件,Flask-Migrate 用于解决数据库迁徙等等。

如有帮忙,请多关注
集体微信公众号:【Python 全视角】
TeahLead_KrisChang,10+ 年的互联网和人工智能从业教训,10 年 + 技术和业务团队治理教训,同济软件工程本科,复旦工程治理硕士,阿里云认证云服务资深架构师,上亿营收 AI 产品业务负责人。

退出移动版