Flask框架路由和视图用法实例分析
Flask是一种使用Python编写的Web开发框架。Flask框架能够帮助我们快速构建Web应用程序。在Flask框架中,我们需要关注的一些关键概念包括路由(routing)、视图(views)、模板(templates)和表单(forms)。在本文中,我将详细介绍Flask框架中的路由和视图的用法,并提供两个完整的代码示例。
路由(routing)
在Flask中,路由是指将URL映射到网站处理程序的过程。路由器负责将HTTP请求分配到相应的处理程序上。Flask中的路由通常使用装饰器的方式定义。
在下面的代码示例中,我们将创建一个将URL /
映射到函数 index()
的路由器:
from flask import Flask
app = Flask(__name__)
@app.route('/')
def index():
return 'Hello, World!'
在这个代码中,index()
函数将会处理对根URL /
的GET请求,并返回一个字符串 'Hello, World!'
。使用Flask框架,非常容易创建新的路由,只需要添加一个新的路由装饰器即可。
视图(views)
视图是Web应用程序的核心组件,视图负责将数据呈现给用户。Python中的视图通常是处理HTTP请求并生成HTML响应的函数。
在下面的代码示例中,我们将创建一个将URL /books
映射到函数 list_books()
的视图。
from flask import Flask, render_template
app = Flask(__name__)
@app.route('/books')
def list_books():
books = ['Python Crash Course', 'Flask Web Development', 'Django for Beginners']
return render_template('books.html', books=books)
在这个代码示例中,我们定义了一个函数 list_books()
,该函数负责渲染模板 books.html
,并将书籍列表books
传递给该模板。可以看到,使用Flask框架创建视图非常容易。
示例1:创建博客网站
接下来,我们将使用Flask框架创建一个博客网站。这个示例项目将使用Jinja2模板引擎来渲染模板,并使用SQLite数据库来存储文章内容。在这个示例中,我们将学习如何创建并使用路由,如何使用视图,以及如何在Flask中使用数据库。
我们将创建以下四个URL,每个URL将使用不同的视图处理器:
/
: 使用index()
视图,显示所有文章的概览/article/<article_id>
: 使用article()
视图,显示给定ID的文章内容/create
: 使用create()
视图,允许用户创建新文章/about
: 使用about()
视图,显示有关博客的信息和联系方式
下面是完整的Flask应用程序代码。要运行这个应用程序,请将其保存为app.py
文件,并使用命令flask run
运行。
import sqlite3
from flask import Flask, render_template, request, redirect, url_for
DB_NAME = 'test.db'
app = Flask(__name__)
app.config['SECRET_KEY'] = 'secret'
def get_articles():
with sqlite3.connect(DB_NAME) as conn:
c = conn.cursor()
result = c.execute('SELECT id, title, text FROM articles')
articles = [{'id': row[0], 'title': row[1], 'text': row[2]} for row in result.fetchall()]
return articles
def get_article(article_id):
with sqlite3.connect(DB_NAME) as conn:
c = conn.cursor()
result = c.execute('SELECT id, title, text FROM articles WHERE id = ?', (article_id,))
article = {'id': result.fetchone()[0], 'title': result.fetchone()[1], 'text': result.fetchone()[2]}
return article
@app.route('/')
def index():
articles = get_articles()
return render_template('index.html', articles=articles)
@app.route('/article/<int:article_id>')
def article(article_id):
article = get_article(article_id)
return render_template('article.html', article=article)
@app.route('/create', methods=['GET', 'POST'])
def create():
if request.method == 'POST':
title = request.form['title']
text = request.form['text']
with sqlite3.connect(DB_NAME) as conn:
c = conn.cursor()
c.execute('INSERT INTO articles (title, text) VALUES (?, ?)', (title, text))
conn.commit()
return redirect(url_for('index'))
else:
return render_template('create.html')
@app.route('/about')
def about():
return render_template('about.html')
if __name__ == '__main__':
app.run(debug=True)
在这个例子中,我们首先导入相关的模块,并定义了数据库文件的名称和应用程序的名称。在下一步中,我们创建两个函数 get_articles()
和 get_article()
,这两个函数分别从数据库中检索所有文章或特定文章的信息。这些函数返回文章信息的列表或文章信息的字典。
接下来,我们定义了四个路由。每个路由都映射到不同的视图处理器,并使用Jinja2模板引擎渲染不同的模板。在视图中,我们调用了 get_articles()
和 get_article()
函数来检索文章信息,然后将它们传递给模板以进行渲染。
例子2:创建REST API
另一个常见的任务是创建REST API。在下面的代码示例中,我们将创建一个简单的REST API,用于检索和更新用户的帐户信息。这个API包含两个路由:
/user/<int:user_id>
: 使用get_user()
视图,检索给定ID的用户信息/user/<int:user_id>
: 使用update_user()
视图,更新给定ID的用户信息
下面是完整的Flask应用程序代码。要运行这个应用程序,请将其保存为app.py
文件,并使用命令flask run
运行。
import sqlite3
from flask import Flask, jsonify, request, abort
DB_NAME = 'test.db'
app = Flask(__name__)
app.config['SECRET_KEY'] = 'secret'
def get_user(user_id):
with sqlite3.connect(DB_NAME) as conn:
c = conn.cursor()
result = c.execute('SELECT id, name, email FROM users WHERE id = ?', (user_id,))
user = {'id': result.fetchone()[0], 'name': result.fetchone()[1], 'email': result.fetchone()[2]}
return user
def update_user(user_id, name, email):
with sqlite3.connect(DB_NAME) as conn:
c = conn.cursor()
result = c.execute('UPDATE users SET name = ?, email = ? WHERE id = ?', (name, email, user_id,))
rows_modified = result.rowcount
conn.commit()
return rows_modified == 1
@app.route('/user/<int:user_id>')
def get_user_route(user_id):
user = get_user(user_id)
if user is None:
abort(404)
else:
return jsonify(user)
@app.route('/user/<int:user_id>', methods=['PUT'])
def update_user_route(user_id):
if not request.json:
abort(400)
if 'name' not in request.json or 'email' not in request.json:
abort(400)
if not update_user(user_id, request.json['name'], request.json['email']):
abort(500)
return jsonify({'success': True})
if __name__ == '__main__':
app.run(debug=True)
在这个例子中,我们首先导入相关的模块,并定义了数据库文件的名称和应用程序的名称。在下一步中,我们创建两个函数 get_user()
和 update_user()
,这两个函数分别从数据库中检索特定用户的信息或更新特定用户的信息。
接下来,我们定义了两个路由。第一个路由使用了 get_user()
函数来检索用户信息,并使用 jsonify()
函数将结果格式化为JSON响应。第二个路由使用了 update_user()
函数来更新用户信息,并将操作结果返回为JSON响应。
总结
在本文中,我们介绍了Flask框架中的路由和视图的用法,并提供了两个完整的代码示例。通过这些指南,你应该能够开始使用Flask框架来创建Python Web应用程序。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Flask框架路由和视图用法实例分析 - Python技术站