本文将具体探讨 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
,并具备两个属性:id
和username
。这两个属性都是数据库表的列。
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_resource
将HelloWorld
类绑定到/
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_request
、before_request
、after_request
和teardown_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,名为 username
,getcookie
路由读取并返回了这个 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 产品业务负责人。