说明
《Python 教程》 持续更新中,提供建议、纠错、催更等加作者微信: gairuo123(备注:pandas教程)和关注公众号「盖若」ID: gairuo。跟作者学习,请进入 Python学习课程。欢迎关注作者出版的书籍:《深入浅出Pandas》 和 《Python之光》。
Flask 是一个用 Python 编写的微型 Web 框架,它的设计哲学是简洁和灵活,允许开发者快速构建 Web 应用。
在使用 Flask 之前,需要确保已经安装了 Flask,可以使用 pip 来安装:
pip install Flask
创建一个基本的 Flask 应用只需要几行代码。以下是一个简单的示例:
from flask import Flask
app = Flask(__name__)
@app.route('/')
def hello_world():
return 'Hello, World!'
if __name__ == '__main__':
app.run(debug=True)
在这个示例中:
from flask import Flask
:导入 Flask 类。app = Flask(__name__)
:创建一个 Flask 应用实例。@app.route('/')
:使用路由装饰器定义一个路由(即 URL)。def hello_world()
:定义一个视图函数,当用户访问根 URL (/) 时,将返回 “Hello, World!”。app.run(debug=True)
:启动 Flask 开发服务器,debug=True 表示启用调试模式。路由是 Flask 中用来处理 URL 与函数之间关系的机制。通过 @app.route 装饰器可以定义 URL 路径。
@app.route('/user/<username>')
def show_user_profile(username):
return f'User {username}'
在这个例子中,<username>
是一个动态部分,它将捕获 URL 中对应的部分并传递给视图函数。
Flask 提供了处理 HTTP 请求和响应的便捷方式。
from flask import request
@app.route('/login', methods=['GET', 'POST'])
def login():
if request.method == 'POST':
username = request.form['username']
password = request.form['password']
# 处理登录逻辑
return render_template('login.html')
在这个示例中:
request.method
用来获取请求的方法(GET 或 POST)。request.form
用来获取表单数据。Flask 使用 Jinja2 作为其模板引擎,可以方便地生成动态 HTML 内容。
from flask import render_template
@app.route('/hello/<name>')
def hello(name):
return render_template('hello.html', name=name)
在 hello.html 模板中:
<!doctype html>
<html>
<head>
<title>Hello</title>
</head>
<body>
<h1>Hello, {{ name }}!</h1>
</body>
</html>
Flask 自动将 static 文件夹中的文件作为静态文件服务。可以在 HTML 模板中使用 url_for 函数引用这些文件。
<link rel="stylesheet" type="text/css" href="{{ url_for('static', filename='style.css') }}">
可以通过配置文件或直接在代码中配置 Flask 应用。
app.config['DEBUG'] = True
或者使用配置文件:
app.config.from_pyfile('config.py')
Flask 有许多扩展可以用来添加各种功能,如数据库集成、表单处理、用户认证等。
例如,使用 Flask-SQLAlchemy 进行数据库操作:
from flask_sqlalchemy import SQLAlchemy
app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:///test.db'
db = SQLAlchemy(app)
下面是一个使用 Flask 和 SQLite 的完整示例。我们将创建一个简单的应用,用于管理用户的待办事项。
首先,我们来确定项目的基本结构:
/todo_app
/static
/templates
app.py
config.py
确保安装了 Flask 和 Flask-SQLAlchemy:
pip install Flask Flask-SQLAlchemy
在 config.py 中,我们存放应用的配置项:
import os
basedir = os.path.abspath(os.path.dirname(__file__))
class Config:
SECRET_KEY = os.environ.get('SECRET_KEY') or 'you-will-never-guess'
SQLALCHEMY_DATABASE_URI = 'sqlite:///' + os.path.join(basedir, 'app.db')
SQLALCHEMY_TRACK_MODIFICATIONS = False
创建 app.py,这是我们的主应用文件:
from flask import Flask, render_template, request, redirect, url_for
from flask_sqlalchemy import SQLAlchemy
from config import Config
app = Flask(__name__)
app.config.from_object(Config)
db = SQLAlchemy(app)
class Todo(db.Model):
id = db.Column(db.Integer, primary_key=True)
task = db.Column(db.String(120), nullable=False)
done = db.Column(db.Boolean, default=False)
def __repr__(self):
return f'<Todo {self.task}>'
@app.route('/')
def index():
todos = Todo.query.all()
return render_template('index.html', todos=todos)
@app.route('/add', methods=['POST'])
def add():
task = request.form.get('task')
if task:
new_todo = Todo(task=task)
db.session.add(new_todo)
db.session.commit()
return redirect(url_for('index'))
@app.route('/update/<int:todo_id>')
def update(todo_id):
todo = Todo.query.get(todo_id)
if todo:
todo.done = not todo.done
db.session.commit()
return redirect(url_for('index'))
@app.route('/delete/<int:todo_id>')
def delete(todo_id):
todo = Todo.query.get(todo_id)
if todo:
db.session.delete(todo)
db.session.commit()
return redirect(url_for('index'))
if __name__ == '__main__':
# 使用应用上下文
with app.app_context():
db.create_all()
app.run(debug=True)
创建模板文件,在 templates 文件夹中创建 index.html:
<!doctype html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Todo List</title>
<link rel="stylesheet" href="{{ url_for('static', filename='style.css') }}">
</head>
<body>
<h1>Todo List</h1>
<form action="{{ url_for('add') }}" method="POST">
<input type="text" name="task" placeholder="Enter a new task">
<button type="submit">Add</button>
</form>
<ul>
{% for todo in todos %}
<li>
<a href="{{ url_for('update', todo_id=todo.id) }}" style="text-decoration: none;">
{% if todo.done %}✅{% else %}❌{% endif %}
</a>
{{ todo.task }}
<a href="{{ url_for('delete', todo_id=todo.id) }}" style="text-decoration: none; color: red;">🗑️</a>
</li>
{% endfor %}
</ul>
</body>
</html>
启动应用,确保你在项目的根目录下,然后运行:
python app.py
访问应用:在浏览器中访问 http://127.0.0.1:5000
,你应该会看到一个简单的待办事项列表应用。
这个示例展示了如何使用 Flask 和 SQLite 创建一个简单的待办事项应用。我们通过 Flask-SQLAlchemy 进行数据库操作,通过 HTML 表单进行数据输入,并通过路由处理不同的请求。这个示例只是一个起点,你可以根据需求扩展和修改应用。
更新时间:2024-07-08 15:09:20 标签:python flask web 框架