Flask之快速入门


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>