Python web 开发已经有了相当长的历史,从最早的 CGI 脚本到现在的全栈 Web 框架,现在已经成为了一种非常流行的方式。
Python 最早被用于 Web 开发是在 1995 年(90年代早期),当时使用 CGI 脚本编写动态 Web 页面。2004 年 Django 框架发布,它是一个高度模块化的框架,提供了许多开箱即用的功能,使得 Web 开发更加容易和快速。Flask 框架于 2010 年发布,是一个轻量级的框架,它提供了更少的默认功能,但也更灵活,允许开发者根据需要添加或删除功能。
Flask 是一款 Python 的轻量级 Web 框架,它的特点是简单易用、灵活性高。Flask 框架可以快速搭建 Web 应用程序,是一个很好的选择。Flask 框架的核心思想是 WSGI(Web Server Gateway Interface),它定义了 Web 服务器和 Web 应用程序之间的通信协议。
简单易用:Flask 框架的 API 简单易用,开发者能够快速上手。MVC设计模式。
灵活性高:Flask 框架的扩展性高,可以根据实际需求进行扩展。
轻量级:Flask 框架的代码量小,运行速度快。
文档丰富:Flask 框架的文档非常详细,开发者能够轻松查找所需信息。
轻量级:Flask 框架的轻量级也是它的缺点之一,它的功能相对有限,需要自己进行扩展。
不适合大型应用程序:Flask 框架适合小型应用程序,对于大型应用程序来说,可能会出现性能瓶颈。这时可以考虑Django。
Flask 框架由以下几个基础组件组成:
路由:定义 URL 和视图函数之间的映射关系。
视图函数:处理请求并返回响应。
模板:生成 HTML 页面。
表单:处理用户提交的数据。
扩展:实现 Flask 框架的扩展功能。
在开始使用 Flask 之前,需要先安装 Flask。可以使用 pip 命令进行安装:
pip install Flask
下面是一个简单的示例,展示了如何使用 Flask 框架输出 "Hello World"。
新建一个app.py文件,输入如下内容。
Linux下执行:
export FLASK_APP=app.py
flask run
打开浏览器访问 http://127.0.0.1:5000/ 即可。
如果是 windows 执行:
set FLASK_APP=app.py
flask run
from flask import Flask
app = Flask(__name__)
@app.route('/')
def hello_world():
return 'Hello, World!'
在 Flask 中,路由和视图函数是紧密相关的。路由用于将 URL 映射到视图函数上,视图函数则处理请求并返回响应。为了实现路由和视图函数,我们可以使用 Flask 中的 @app.route
装饰器。下面是一个简单的示例:
from flask import Flask
app = Flask(__name__)
@app.route('/')
def index():
return 'This is the index page.'
@app.route('/hello')
def hello():
return 'Hello, World!'
@app.route('/')
和 @app.route('/hello')
分别定义了两个路由,index()
和 hello()
则是两个视图函数。
模板是 Flask 中生成 HTML 页面的一种方式。Flask 支持多种模板引擎,包括 Jinja2、Mako、Tenjin 等。在本文中,我们使用 Jinja2 作为模板引擎。
下面是一个简单的示例,展示了如何使用模板生成 HTML 页面:
from flask import Flask, render_template
app = Flask(__name__)
@app.route('/')
def index():
return render_template('index.html', title='Home')
@app.route('/hello')
def hello():
return render_template('hello.html', name='Flask')
render_template()
函数用于渲染模板,第一个参数指定模板名称,第二个参数则是模板中使用的变量。
静态文件包括 CSS、JavaScript、图片等。在 Flask 中,可以使用 url_for()
函数生成静态文件的 URL。
下面是一个简单的示例:
{{ title }}
{{ title }}
Hello, Flask!
url_for('static', filename='style.css')
生成了静态文件 style.css
的 URL。
表单是 Web 应用程序中常用的一种交互方式。在 Flask 中,可以使用 request
对象获取用户提交的表单数据。
下面是一个简单的示例:
from flask import Flask, request
app = Flask(__name__)
@app.route('/login', methods=['GET', 'POST'])
def login():
if request.method == 'POST':
username = request.form['username']
password = request.form['password']
if username == 'admin' and password == 'password':
return 'Login success!'
else:
return 'Invalid username or password.'
else:
return '''
'''
request.form
可以获取 POST 请求提交的表单数据。
接下来,我们将通过一个实战案例来介绍如何使用 Flask 框架构建一个 Todo 应用。
首先,我们需要设计数据库。在本文中,我们使用 MySQL 作为数据库。下面是数据库的设计:
CREATE TABLE `todos` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`title` varchar(255) NOT NULL,
`completed` tinyint(1) NOT NULL DEFAULT '0',
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
接下来实现后端的功能:
from flask import Flask, render_template, request, redirect, url_for
import pymysql.cursors
app = Flask(__name__)
app.config['SECRET_KEY'] = 'secret'
connection = pymysql.connect(
host='localhost',
user='root',
password='password',
db='todo',
charset='utf8mb4',
cursorclass=pymysql.cursors.DictCursor
)
@app.route('/')
def index():
with connection.cursor() as cursor:
cursor.execute('SELECT * FROM `todos`')
todos = cursor.fetchall()
return render_template('index.html', todos=todos)
@app.route('/add', methods=['POST'])
def add():
title = request.form['title']
with connection.cursor() as cursor:
cursor.execute('INSERT INTO `todos` (`title`) VALUES (%s)', title)
connection.commit()
return redirect(url_for('index'))
@app.route('/toggle/', methods=['POST'])
def toggle(todo_id):
with connection.cursor() as cursor:
cursor.execute('SELECT `completed` FROM `todos` WHERE `id` = %s', todo_id)
completed = cursor.fetchone()['completed']
cursor.execute('UPDATE `todos` SET `completed` = %s WHERE `id` = %s', (not completed, todo_id))
connection.commit()
return redirect(url_for('index'))
@app.route('/delete/', methods=['POST'])
def delete(todo_id):
with connection.cursor() as cursor:
cursor.execute('DELETE FROM `todos` WHERE `id` = %s', todo_id)
connection.commit()
return redirect(url_for('index'))
解析:建立数据库连接,并定义四个路由:
/
:显示所有的 Todo。
/add
:添加一个 Todo。
/toggle/
:标记一个 Todo 是否已完成。
/delete/
:删除一个 Todo。
最后实现前端的功能:
Todo
Todo
{% for todo in todos %}
-
{% else %}
No todos.
{% endfor %}
我们使用了 Jinja2 模板引擎,展示了 Todo 列表、添加 Todo、标记 Todo 是否已完成、删除 Todo 等功能。
今天介绍了如何使用 Flask 框架进行 Web 开发,并实战开发了一个轻量级的web应用。Flask 是一款 Python 的轻量级 Web 框架,具有简单易用、灵活性高等优点,初学者也能快速上手。