Flask之快速入门
Flask 是一个轻量级的 Python Web 框架,以简洁、灵活著称,适合快速开发小型到中型 Web 应用。它基于 Werkzeug(WSGI 工具库)和 Jinja2(模板引擎),核心思想是“微框架”——仅保留 Web 开发的核心功能,其余功能通过扩展实现,让开发者可以按需定制。
一、Flask 安装
首先通过 pip 安装 Flask:
pip install flask
二、第一个 Flask 应用:Hello World
创建一个最简单的 Flask 应用,只需以下几步:
1. 编写代码(app.py)
# 导入 Flask 类
from flask import Flask
# 创建 Flask 应用实例(__name__ 表示当前模块名,用于定位资源)
app = Flask(__name__)
# 定义路由(URL 路径)和视图函数(处理请求并返回响应)
# @app.route 是装饰器,将 URL 路径 '/' 映射到 hello_world 函数
@app.route('/')
def hello_world():
# 视图函数返回的字符串会作为 HTTP 响应内容
return 'Hello, Flask!'
# 当脚本直接运行时,启动开发服务器
if __name__ == '__main__':
# debug=True 开启调试模式(代码修改后自动重启,错误信息显示在浏览器)
app.run(debug=True)
2. 运行应用
在终端执行脚本:
python app.py
输出类似:
* Serving Flask app 'app' (lazy loading)
* Environment: development
* Debug mode: on
* Running on http://127.0.0.1:5000/ (Press CTRL+C to quit)
3. 访问应用
打开浏览器,访问 http://127.0.0.1:5000/,页面会显示 Hello, Flask!。
三、核心概念:路由与视图函数
路由:通过 @app.route(URL路径) 装饰器定义,用于将 URL 路径映射到对应的视图函数。
视图函数:处理该 URL 的请求,返回响应内容(字符串、HTML、JSON 等)。
1. 基本路由示例
# 访问 http://127.0.0.1:5000/hello 时执行
@app.route('/hello')
def hello():
return 'Hello, 这是一个新页面!'
# 访问 http://127.0.0.1:5000/about 时执行
@app.route('/about')
def about():
return '这是关于页面'
2. 动态路由(带参数的 URL)
URL 路径中可以包含变量,通过 <变量名> 定义,视图函数通过参数接收该值。
# 动态路由:匹配 /user/任意字符串(如 /user/小明)
@app.route('/user/<username>')
def show_user_profile(username):
# 接收 URL 中的 username 参数并返回
return f'用户名为:{username}'
# 带类型限制的动态路由:<int:id> 表示仅匹配整数
@app.route('/post/<int:post_id>')
def show_post(post_id):
return f'文章 ID:{post_id}' # 仅当 URL 为 /post/123 时匹配,/post/abc 不匹配
支持的类型:int(整数)、float(浮点数)、path(路径,包含斜杠)等。
四、模板渲染(Jinja2)
Flask 内置 Jinja2 模板引擎,用于生成动态 HTML 页面。模板文件需放在项目根目录的 templates 文件夹中(固定目录名)。
1. 创建模板文件
在项目根目录创建 templates 文件夹,新建 index.html:
<!-- templates/index.html -->
<!DOCTYPE html>
<html>
<head>
<title>首页</title>
</head>
<body>
<h1>欢迎来到 {{ title }}!</h1> <!-- {{ 变量名 }} 用于输出变量 -->
<p>当前时间:{{ current_time }}</p>
</body>
</html>
2. 在视图函数中渲染模板
使用 flask.render_template 函数加载并渲染模板,可传递变量到模板中。
from flask import Flask, render_template
import datetime
app = Flask(__name__)
@app.route('/')
def index():
# 获取当前时间
now = datetime.datetime.now().strftime('%Y-%m-%d %H:%M:%S')
# 渲染 templates/index.html,传递 title 和 current_time 变量
return render_template('index.html', title='我的网站', current_time=now)
访问 http://127.0.0.1:5000/,页面会显示动态内容(标题和当前时间)。
3. 模板语法(基础)
- 变量输出:
{{ 变量名 }}(如{{ username }})。 - 条件判断:
{% if user %}
<p>欢迎 {{ user }}!</p>
{% else %}
<p>请登录</p>
{% endif %}
- 循环:
<ul>
{% for item in items %}
<li>{{ item }}</li>
{% endfor %}
</ul>
五、请求与响应
Flask 通过 request 对象处理客户端发送的请求数据(如表单、URL 参数),通过返回值或 make_response 构建响应。
1. 处理请求数据(request 对象)
需从 flask 导入 request,常用属性:
request.method:请求方法(GET/POST等)。request.args:GET 请求的查询参数(如?name=小明)。request.form:POST 请求的表单数据。
示例:处理 GET 和 POST 请求
from flask import Flask, request, render_template
app = Flask(__name__)
# 允许该路由接收 GET 和 POST 方法(默认仅支持 GET)
@app.route('/login', methods=['GET', 'POST'])
def login():
if request.method == 'POST':
# 处理 POST 请求:获取表单数据(假设表单有 username 和 password 字段)
username = request.form.get('username')
password = request.form.get('password')
return f'登录信息:用户名={username},密码={password}'
else:
# 处理 GET 请求:返回登录表单
return render_template('login.html')
创建登录表单模板 templates/login.html:
<!-- templates/login.html -->
<form method="post"> <!-- 表单提交方式为 POST -->
<input type="text" name="username" placeholder="用户名"><br>
<input type="password" name="password" placeholder="密码"><br>
<button type="submit">登录</button>
</form>
2. 构建响应
- 直接返回字符串:默认状态码 200(成功)。
- 返回元组:
(响应内容, 状态码, 响应头)。 - 使用
make_response自定义响应:
from flask import make_response
@app.route('/custom')
def custom_response():
# 自定义响应(内容、状态码、响应头)
response = make_response('自定义响应', 201) # 201 表示创建成功
response.headers['X-Test'] = 'Flask' # 添加响应头
return response
3. 返回 JSON 数据
通过 jsonify 函数返回 JSON 格式响应(自动设置 Content-Type: application/json):
from flask import jsonify
@app.route('/api/user')
def user_api():
user_data = {
'id': 1,
'name': '小明',
'age': 20
}
return jsonify(user_data) # 等价于 return user_data(Flask 1.1+ 支持直接返回字典)
六、静态文件(CSS/JS/图片)
静态文件(如样式表、脚本、图片)需放在 static 文件夹中(固定目录名),在模板中通过 url_for('static', filename='路径') 引用。
1. 目录结构
myapp/
├── app.py # 主程序
├── static/ # 静态文件目录
│ ├── css/
│ │ └── style.css # CSS 文件
│ └── js/
│ └── script.js # JS 文件
└── templates/ # 模板目录
└── index.html # 模板文件
2. 在模板中引用静态文件
<!-- templates/index.html -->
<!DOCTYPE html>
<html>
<head>
<!-- 引用 static/css/style.css -->
<link rel="stylesheet" href="{{ url_for('static', filename='css/style.css') }}">
</head>
<body>
<h1>静态文件示例</h1>
<!-- 引用 static/js/script.js -->
<script src="{{ url_for('static', filename='js/script.js') }}"></script>
</body>
</html>
七、Flask 开发服务器配置
app.run() 可配置开发服务器的参数:
if __name__ == '__main__':
app.run(
host='0.0.0.0', # 允许外部访问(默认仅本地 127.0.0.1)
port=8080, # 端口(默认 5000)
debug=True # 调试模式(开发环境用,生产环境必须关闭)
)
- debug=True 特性:代码修改后自动重启服务器;错误时显示详细堆栈信息。
- 生产环境注意:绝不能使用 Flask 内置开发服务器,需用 Gunicorn、uWSGI 等生产级服务器。
八、总结
Flask 快速入门核心点:
1.安装:pip install flask。
2.基本结构:Flask 实例 + @app.route 路由 + 视图函数。
3.动态路由:通过 <变量名> 接收 URL 参数。
4.模板:templates 目录存放 HTML,render_template 渲染并传递变量。
5.请求处理:request 对象获取 GET/POST 数据。
6.静态文件:static 目录存放 CSS/JS,url_for 引用。
Flask 的灵活性使其适合从简单demo到复杂应用的开发,后续可通过扩展(如 Flask-SQLAlchemy 操作数据库、Flask-Login 处理用户认证)扩展功能。
一、初识Flask
1、安装Flask
(flask_study) C:\Users\Administrator>pip install flask
2、简单实例
from flask import Flask
#实例化Flask对象
app = Flask(__name__)
@app.route('/')
def index():
return "index"
if __name__ == '__main__':
app.run()
这样简单的几行代码就可以进行运行,默认启动的端口时5000端口。
二、快速入门
现在可以通过一个简单的登录实例来进行学习了解一下。
from flask import Flask, request, render_template, redirect
app = Flask(__name__)
user_data = {
1: {'name': '张三', 'age': 23, 'gender': '男'},
2: {'name': '李四', 'age': 18, 'gender': '男'},
3: {'name': '王五', 'age': 35, 'gender': '女'},
}
@app.route('/index')
def index():
return render_template('index.html', user=user_data)
@app.route('/login', methods=['GET', 'POST'], endpoint='login')
def login():
if request.method == 'GET':
return render_template('login.html')
else:
user = request.form.get("user")
pwd = request.form.get("pwd")
if user == "root" and pwd == "123":
return redirect('/index')
return render_template('login.html')
if __name__ == '__main__':
app.run(debug=True, host="0.0.0.0", port=80)
上面在这个.py文件下新建一个templates文件夹,然后再里面新建一个login.html、index.html这样才能找到这个文件。因为在Flask这个类中默认模板的路径就是在同级的templates文件夹下找模板文件。
login.html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<form method="post">
<input type="text" name="user" value="用户名"/>
<input type="text" name="pwd" value="密码"/>
<input type="submit" value="登录">
</form>
</body>
</html>
index.html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
{% for k,v in user.items() %}
<li>{{ v.name }}-{{ v.age }}-{{ v.gender }}</li>
{% endfor %}
</body>
</html>