web之flask框架开篇
Flask框架简介
Flask是一个用Python编写的轻量级Web应用框架。Flask因其重量轻,被广泛应用于小型应用、快速开发项目或作为大型项目的微服务组件。Flask依赖于两个外部库:Werkzeug和Jinja2,前者是负责Web请求和响应的WSGI工具集;后者是生成动态HTML页面的模板引擎。Flask的设计理念是通过扩展来提供足够的基本功能,同时提高Flask的能力,使Flask既灵活又强大。
对初学者而言,Flask极低的入门门槛是一大优势。Flask可以通过最少的代码快速启动基本的网页服务,同时也为专业开发者构建复杂的Web应用提供了足够的自定义空间。虽然Flask被归类为“微框架”,但它的功能并不微不足道,Flask可以胜任从简单的个人博客到复杂的企业级应用。
Flask的官方文件非常丰富和易于理解,这也是Flask流行的原因之一。它不仅详细介绍了框架的使用方法,还指导了如何测试和部署。在强大的社区支持的帮助下,我们通常可以在网络上找到解决方案或相应的扩展工具来解决问题。
Flask应用的基本组成部分
Flask应用程序的创建和运行非常简单,基本的Flask应用程序主要包括以下几个部分:应用实例、路由和视图函数。应用例子是Flask类的对象,它是Web应用的中心。在视图函数的映射下,路由是URL到视图函数的映射,描述了应用的URL模式和相应的处理函数。视觉函数是用来处理请求并返回响应内容的函数。以下是对这些部分基本用法的代码示例。
from flask import Flask app = Flask(__name__) @app.route('/') def home(): return 'Hello, Flask!' if __name__ == '__main__': app.run(debug=True)
在上述代码中,我们首先导入了Flask类,然后创建了一个例子。接着,我们定义了一条路线(`@app.route('/''`),当用户访问网站根地址`/`时,将调用视图函数。`home`,这个函数返回字符串''Hello, Flask!'`。在if块中,我们检查当前是否是直接运行的脚本,并调用它们。`app.run`来启动服务器,其中`debug=True`参数表示开启调试模式,方便我们调试应用。
Flask模板和静态文件
在Web开发中,使用HTML页面向用户显示信息是最常见的方式。Flask为模板引擎Jinja2提供了支持,允许开发者动态生成HTML页面。通过使用模板,我们可以将业务逻辑与页面的表现逻辑分开,使代码更加清晰,易于维护。
以下是一个简单的使用Flask渲染模板的例子。在Flask应用目录下,我们创建了一个HTML文件`templates`在文件夹中。接着使用视图函数。`render_template`该函数负责找到模板并使用上下文渲染它,最终将结果返回到客户端。
# app.py代码 from flask import Flask, render_template app = Flask(__name__) @app.route('/hello') def hello(): return render_template('hello.html', name='World') # hello.模板代码html <!DOCTYPE html> <html> <head> <title>Hello Template</title> </head> <body> <h1>Hello, {{ name }}!</h1> </body> </html>
在上述代码中,`render_template('hello.html', name='World''''即将查找`hello.html`模具,传递一个变量`name`给它。在`hello.html`我们使用了模板`{{ name }}`展示变量内容。当访问`/hello`使用者可以看到路径`Hello, World!`的问候。
Flask除了模板外,还会处理JavaScript脚本、CSS样式表和图片等静态文件。Flask将默认`static`作为静态文件存储目录的文件夹,我们可以让Flask知道如何通过设置路由返回静态资源。
Flask的表单处理
Web应用程序的另一个重要功能是处理用户输入。我们可以使用Flask。`request`对象可以获得用户提交的表单数据。通过WTForms的扩展,我们可以进一步简化表单处理。它提供了表单类和验证机制,但在这里,我们只展示了没有扩展的基本方法。
以下是一个简单的表单处理示例,可以接收用户提交的姓名,并显示问候。
# app.py代码 from flask import Flask, render_template, request app = Flask(__name__) @app.route('/greet', methods=['GET', 'POST']) def greet(): if request.method == 'POST': name = request.form['name'] return f'Hello, {name}!' return render_template('greet_form.html') # greet_form.模板代码html <!DOCTYPE html> <html> <head><title>Greet</title></head> <body> <form method="post"> <p>Your name: <input type="text" name="name"></p> <p><button type="submit">Greet</button></p> </form> </body> </html>
以上代码定义了一个`/greet`路由,路由同时接受`GET`和`POST`方法。当方法为`POST`时,我们从`request.form`中间获得提交`name`字段,回到个性化的问候。当使用者第一次访问`/greet`方法默认为路径`GET`,在这个时候返回包含表单的页面。上述代码还展示了如何在模板中创建一个表单,并且通过设置`method="post"`指定提交表单数据的方法。
Flask的数据库交互
现代化Web应用程序通常需要与数据库进行交互,以持续和查询数据。Flask本身并不包含数据库操作的功能,但是它可以很容易地与ORM(对象关系映射)库结合使用,比如SQLAlchemy。ORM允许开发者用Python类来表示数据库中的表,并以对象的形式操作数据库。
下面是Flask和SQLAlchemy使用的简化示例。为了代表数据库中的用户表,我们定义了User模型,并在视图函数中进行查询操作。
# app.py代码 from flask import Flask, render_template from flask_sqlalchemy import SQLAlchemy app = Flask(__name__) app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:///mydatabase.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) @app.route('/users') def list_users(): users = User.query.all() return render_template('users.html', users=users) # users.模板代码html <!DOCTYPE html> <html> <head><title>List of Users</title></head> <body> <ul> {% for user in users %} <li>{{ user.username }}</li> {% endfor %} </ul> </body> </html>
本例中,我们首先配置了SQLAlchemy使用的数据库URI,并创建了SQLAlchemy的数据库URI。`db`对象。接着我们定义了`User`类,并通过装饰器`@app.route`为所有用户创建了一个展示路由。视图函数函数位于该路由`list_users`我们在中间使用`User.query.all()`获取所有用户对象,然后通过`render_template`渲染`users.html`并且将用户列表传递给模板。通过这种方式,用户可以看到包含所有用户名的列表。
Flask结合SQLAlchemy提供了一种简洁高效的数据库操作方法。SQLAlchemy实际上支持更复杂的查询和操作,以便在Flask应用中定义模型和查询数据库。