本文将具体探讨Python Flask Web服务。我将首先简略介绍Flask,而后将逐渐进入Flask中的路由、模板、表单解决以及数据库集成等高级概念,指标是可能让大家理解并把握应用Flask来创立动静Web利用的技巧。
1. Flask简介
Flask是一个轻量级的Web服务器网关接口(WSGI)web利用框架。它被设计为易于应用,同时也提供了扩展性,用户能够自在地抉择将其与哪些第三方库集成。Flask是"微"框架,这意味着其外围性能十分无限,但能够通过一系列的扩大来加强性能。
让咱们来看一下如何创立一个简略的Flask利用。
from flask import Flaskapp = 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 requestfrom flask_wtf import FlaskFormfrom wtforms import StringFieldclass 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 SQLAlchemyapp.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, Apiapi = 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 Blueprintsimple_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_requestdef 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产品业务负责人。