初识 Flask 框架

发布于:2025-06-15 ⋅ 阅读:(21) ⋅ 点赞:(0)

目录

一.Flask 框架概述

(1).安装 Flask 框架

(2). 创建一个 Flask 应用

二.Flask路由与视图函数

(1).动态路由

(2). 支持多种 HTTP 请求方法

(3).使用 Jinja2 模板渲染 HTML

(4). 模板继承与块

三. Flask 表单处理与用户输入

(1).安装 Flask-WTF

(2).创建一个简单的表单

四. Flask 的项目结构与部署

(1).项目结构

(2).部署 Flask 应用


一.Flask 框架概述

        Flask 作为一个微框架,强调简单性和灵活性。它依赖于两个重要的 Python 库来提供核心功能:

  • Werkzeug:这是 Flask 的底层库,提供了 WSGI 接口、HTTP 请求和响应处理、路由等核心功能
  • Jinja2:一个功能强大的模板引擎,用于动态生成 HTML 页面。

Flask 的设计目的是让开发者能够快速开发应用,并提供了灵活的方式进行扩展。如果你不需要复杂的功能,Flask的核心本身已经足够满足需求。如果你需要更多高级特性,可以通过 Flask 的扩展库进行补充。

(1).安装 Flask 框架

安装 Flask 非常简单,只需使用 Python 的包管理工具 pip 即可:

(2). 创建一个 Flask 应用

Flask的应用结构非常简单,只需创建一个 Python 文件,并通过 Flask()类来实例化应用对象。以下是一个最简单的Flask应用示例:

[root@bogon ~]# vim app.py
from flask import Flask
#创建 Flask 应用实例
app =Flask( __name__)
#定义路由和视图函数
@app.route('/')
def hello_world():
return 'Hello, World!'
#启动应用
if  __name__ ==  '__main__':
app.run(debug=True,host='0.0.0.0',port=5000)

代码解析:

代码 / 语法 功能说明
Flask(__name__) 创建 Flask 应用实例,__name__ 让 Flask 了解当前模块名称,辅助跨模块配置
@app.route('/') 定义路由与视图函数映射,用户访问根 URL 时,调用关联视图函数(如 hello_world )
return 'aaaa' 视图函数返回字符串,Flask 会将其封装为 HTTP 响应,返回给客户端
app.run(debug=True) 启动 Flask 开发服务器,debug=True 启用调试模式,支持自动重载、错误详情展示

(3). 运行 Flask 应用

保存上述代码为 app.py,然后在命令行中运行:

这时 Flask 会启动一个开发服务器,默认会监听127.0.0.1:5000。打开浏览器,访问http://127.0.0.1:5000/,你会看到“hello”的页面。

二.Flask路由与视图函数

        Flask 的核心之一就是路由系统,它将用户访问的 URL 与对应的视图函数相连接。Flask 通过装饰器@app.route()来定义路由,而视图函数则负责处理用户的请求并返回响应        。

(1).动态路由

Flask 支持动态路由参数,可以通过 URL 中的动态部分来获取数据。以下是一个示例:

@app.route('/greet/<name>')
def greet(name):
    return f'hello,{lwy}!'

代码解析:

  • :这是一个动态路由参数,Flask 会提取 URL 中的 name 部分并将其传递给视图函数
  • 当用户访问/greet/John 时,name 的值将为 John,返回的响应为 Hello,John!

(2). 支持多种 HTTP 请求方法

Flask 不仅支持 GET 请求,还支持其他常见的 HTTP 请求方法,如 POST、PUT、DELETE 等。你可以通过methods 参数来指定允许的请求方法:

[root@localhost ~]# vim app.py 
##定义路由和视图函数
@app.route('/submit',methods=['POST'])
def submit():
    return 'ni hao,wodezuguo'

(3).使用 Jinja2 模板渲染 HTML

        Flask 结合 Jinja2 模板引擎来动态生成 HTML 页面。你可以将 HTML 文件与 Python 代码分离,保持应用结构清晰。在 Flask 中,模板文件默认存放在 templates 文件夹中

假设我们有一个名为 greet.html 的模板文件,内容如下:

[root@localhost ~]# mkdir templates
[root@localhost ~]# cd templates/
[root@localhost templates]# vim greet.html
<!DOCTYPE html>
<html lang="en">
<head>
     <meta charset="UTF-8">
     <title>Flask Example</title>
</head>
<body>
      <h1>你好,{{name}}!</h1>
</body>
</html>
[root@localhost ~]# vim app.py
from flask import Flask,render_template
##定义路由和视图函数
@app.route('/greet/<name>')
def greet(name):
    return render_template('greet.html',name=name)

创建脚本文件:

# 从 Flask 框架的核心模块中导入 Flask 类,用于创建 Flask 应用实例
from flask import Flask  
# 从 Flask 框架中导入 render_template 函数,用于渲染 HTML 模板文件
from flask import render_template  
 
# 创建 Flask 应用实例,__name__ 是 Python 内置变量,
# 它的值是当前模块的名称,Flask 会根据这个值来确定应用的根路径,
# 从而找到模板文件、静态文件等资源的位置
app = Flask(__name__)  
 
# 使用 @app.route 装饰器为 '/greet/<name>' 路径注册视图函数。
# 这里的 <name> 是动态路由参数,会将 URL 中对应位置的值传递给视图函数的 name 参数
@app.route('/greet/<name>')  
def greet(name):
    # 调用 render_template 函数,渲染名为 'index.html' 的模板文件。
    # 第二个参数 name=name 是将视图函数接收到的 name 参数传递给模板,
    # 这样在模板中就可以使用 {{ name }} 来获取并显示这个值
    return render_template('index.html', name=name)  
 
# Python 的常见写法,判断当前脚本是否作为主程序运行。
# 当脚本直接被运行时(而不是被其他模块导入时),__name__ 的值会是 '__main__'
if __name__ == '__main__':  
    # 启动 Flask 应用。设置 host='0.0.0.0' 表示允许外部所有 IP 访问该应用;
    # port=5000 指定应用监听的端口为 5000;debug=True 开启调试模式,
    # 在调试模式下,代码修改后应用会自动重启,并且遇到错误时会显示详细的调试信息,方便开发调试
    app.run(host='0.0.0.0', port=5000, debug=True)  

访问测试:

(4). 模板继承与块

Flask 文持模板继承和块(Block)功能,这对于构建复杂页面非常有用。你可以在基础模板中定义通用的布局结构,在子模板中覆盖特定的部分。

基础模板 base.html:

[root@localhost ~]# cd templates/
[root@localhost templates]# vim base.html
<!DOCTYPE html>
<html lang="en">
<head>
        <meta charset="UTF-8">
</head>
<body>
<header>
        <h1>欢迎访问!</h1>
</header>

<div>
        {% block content %}{% endblock %}
</div>

<footer>
        <p>&copy;2025-06-13 My website</p>
</footer>

</body>
</html>

子模板:

[root@localhost ~]# cd templates/
[root@localhost templates]# vim index.html
{% extends 'base.html' %}

{% block title %}Home{% endblock %}

{% block content %}
        <h2>ni hao,huan ying fang wen wo de wangzhan</h2>
{% endblock %}

[root@localhost ~]# vim app.py 
##定义路由和视图函数
@app.route('/')
def greet():
    return render_template('index.html')

代码解析:

{% extends’base.html’%} 子模板继承了 base.html 模板
{% block title %}Home{% endblock ‰} 覆盖父模板中的 title 块
{% block content %} 定义页面的主要内容区域

三. Flask 表单处理与用户输入

Flask可以通过表单来获取用户输入,常见的做法是结合Flask-WTF扩展来简化表单处理和验证

Flask-WTF 为 Flask 提供了一个表单类,你可以在表单类中定义字段和验证规则

(1).安装 Flask-WTF

pip install flask-wtf

(2).创建一个简单的表单

[root@localhost ~]# vim biaodan.py 
from flask import Flask, render_template, request
from flask_wtf import FlaskForm
from wtforms import StringField
from wtforms.validators import DataRequired

app = Flask(__name__)
app.secret_key = 's3cr3t'

class NameForm(FlaskForm):
    name = StringField('Name', validators=[DataRequired()])

@app.route('/', methods=['GET', 'POST'])
def index():
    form = NameForm()
    if form.validate_on_submit():
        return f'Hello, {form.name.data}!'
    return render_template('index.html', form=form)

if __name__ == '__main__':
  #app.run(debug=True)
  app.run(host='0.0.0.0', port=5000, debug=True)

index.html 模块:

[root@localhost ~]# cd templates/
[root@localhost templates]# ls
base.html  greet.html  index.html
[root@localhost templates]# rm -rf *
[root@localhost templates]# vim index.html 
<a!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Flask Form</title>
</head>
<body>
    <h1>Enter your name:</h1>
    <form method="POST">
        {{ form.csrf_token }}
        <label for="name">Name:</label>
        {{ form.name() }}<br><br>
        <button type="submit">Submit</button>
    </form>

    {% if form.name.data %}
        <h2>Hello, {{ form.name.data }}!</h2>
    {% endif %}
</body>
</html>

代码解析:

字段 含义
{{ form.csrf token }} Flask-WTF 会自动生成并验证 CSRF token,以防止跨站请求伪造攻求
{{ form.name()}} 这是通过 Jinja2 模板渲染 NameForm 表单的字段。form.name()会生成对应的 HTML 标签
{% if form.name.data %} 如果用户提交了表单并且 name 字段不为空,则显示欢迎信息

四. Flask 的项目结构与部署

(1).项目结构

随着应用的复杂度增加,Flask应用的结构通常会发生变化。一个典型的Flask 项目结构如下:

/my flask app
	/app
		/templates
			index.html
		/static
			/css
			/js
		_init_.py
		routes.py
		forms.py
run .py
字符 含义
/templates 存放所有 HTML 模板文件
/static 存放静态文件(如CSS、JS、图片等)
_ init _.py 初始化Flask应用。routes.py:定义所有路由和视图函数
routes.py 定义所有路由和视图函数
forms.py 定义表单类

(2).部署 Flask 应用

Flask 应用的开发环境通常使用 Flask run 启动,但在生产环境中,我们需要通过更强大的 web 服务器进行部署,常见的有

Gunicorn 一个Python WSGI HTTP 服务器,常用于生产环境部署
Nginx 作为反向代理,前端处理静态文件请求,转发动态请求到Flask应用。部署时,可以通过以下命令启动 Flask 应用
gunicorn -w 4 run:app

这将启动一个4工作线程的 Gunicorn 服务器,run 是指向 Flask 应用实例的模块


网站公告

今日签到

点亮在社区的每一天
去签到