初识FLask框架

1.FLask框架概述

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

  • Werkzeug:这是 Flask 的底层库,提供了 WSGI 接口、HTTP 请求和响应处理、路由等核心功能。
  • Jinja2:一个功能强大的模板引擎,用于动态生成 HTML 页面。
    Flask 的设计目的是让开发者能够快速开发应用,并提供了灵活的方式进行扩展。如果你不需要复杂的功能,Flask 的核心本身已经足够满足需求。如果你需要更多高级特性,可以通过 Flask 的扩展库进行补充。

1.1安装FLask

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

pip install flask


安装完成后,你可以通过创建一个简单的 Flask 应用来验证是否安装成功。

1.2创建你的第一个FLask 应用

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

from flask import Flask

# 创建Flask应用实例
app = Flask(__name__)

# 定义路由和视图函数
@app.route('/')
def hello_world():
    return 'Hello, World!'

if __name__ == '__main__':
    app.run(debug=True)

代码解析:

  • Flask(name):创建 Flask 应用实例,__name__参数用于 Flask 了解当前模块的名称,通常我们使用这个参数来帮助 Flask 在不同模块间进行配置。
  • @app.route ('/'):定义路由和视图函数的映射。'/' 是根路径,当用户访问根 URL 时,Flask 会调用 hello_world () 函数。
  • return 'Hello, World!':视图函数返回一个简单的字符串响应,Flask 会将其作为 HTTP 响应返回给客户端。
  • app.run (debug = True):启动 Flask 开发服务器,debug = True 表示启用调试模式,这样可以在开发过程中自动重载应用,并在发生错误时显示详细信息。

1.3运行flask应用

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

python app.py

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

2.flask路由与视图函数

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

2.1动态路由

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

@app.route('/greet/')
def greet(name):
    return f'Hello, {name}!'

代码解析:

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

2.2支持多种HTTP请求方法

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

@app.route('/submit', methods=['POST'])
def submit():
    return 'Form submitted successfully!'

代码解析:

  • methods=['POST']:只允许 POST 请求访问此路由。如果用户通过 GET 请求访问,Flask 会返回 405 Method Not Allowed 错误。

2.3使用Jinja2 模板渲染HTML

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

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




    
    Flask Example


    

Hello, {{ name }}!

在 Flask 应用中,我们可以通过 render_template 函数渲染模板并传递动态数据:

from flask import render_template

@app.route('/greet/')
def greet(name):
    return render_template('greet.html', name=name)

代码解析:

  • render_template ('greet.html', name=name):Flask 会加载 greet.html 模板,并将 name 的值传递给模板。模板中的 {{ name }} 会被替换为传入的值。

2.4模板继承与块

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

基础模板 base.html:




    
    {% block title %}My Website{% endblock %}


    

Welcome to My Website

{% block content %}{% endblock %}

© 2025 My Website

子模板 index.html:

{% extends 'base.html' %}
{% block title %}Home{% endblock %}
{% block content %}
    

Welcome to the homepage!

{% endblock %}

代码解析:

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

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

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

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

3.1安装Flask-WTF

pip install flask - wtf

3.2创建一个简单的表单

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)

代码解析:

  • FlaskForm:继承自 FlaskForm 类,定义表单字段。
  • StringField ('Name', validators=[DataRequired ()]):定义了一个文本输入字段,并且通过 DataRequired () 验证器确保字段不能为空。
  • form.validate_on_submit ():检查表单是否通过验证并被提交。

index.html 模板:




    
    Flask Form


    

Enter your name:

{{ form.csrf_token }} {{ form.name() }}

{% if form.name.data %}

Hello, {{ form.name.data }}!

{% endif %}

代码解析:

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

3.3表单验证

Flask 表单处理的强大之处在于它的验证机制。通过 wtforms,你可以非常方便地为表单字段添加各种验证规则。比如,除了 DataRequired (),你还可以使用:

  • Length (min = 2, max = 50):验证输入的长度。
  • Email ():验证输入是否是有效的邮箱地址。
  • EqualTo ('password'):验证两个字段的值是否相等

4.Flask的项目结构与部署

4.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:定义所有路由和视图函数。
  • forms.py:定义表单类。

4.2部署Flask应用

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

  • Gunicorn:一个 Python WSGI HTTP 服务器,常用于生产环境部署。
  • Nginx:作为反向代理,前端处理静态文件请求,转发动态请求到 Flask 应用。
     

部署时,可以通过以下命令启动 Flask 应用:

gunicorn -w 4 run:app

5.小案例:简单博客应用

5.1项目结构

/simple_blog
/app
/templates
index.html
app.py

5.2app.py代码:

from flask import Flask, render_template, request

app = Flask(__name__)

# 存储所有文章
posts = []

@app.route('/', methods=['GET', 'POST'])
def index():
    if request.method == 'POST':
        title = request.form['title']
        content = request.form['content']
        posts.append({'title': title, 'content': content})
    return render_template('index.html', posts=posts)

if __name__ == '__main__':
    app.run(debug=True)

5.3index.html模板:




    
    Simple Blog


    

Welcome to the Blog!

Submit a Post





Posts:

    {% for post in posts %}
  • {{ post.title }}

    {{ post.content }}

  • {% endfor %}
</li> {% endfor %}

5.4代码解析:

  1. 数据存储:我们通过 Python 的 posts 列表存储所有提交的文章,每一篇文章由一个包含 title 和 content 的字典表示。
  2. 表单提交:当用户通过表单提交文章时,Flask 会将文章的标题和内容添加到 posts 列表中。
  3. 模板渲染:Flask 通过 render_template 将所有文章渲染到 index.html 模板中,使用 {% for post in posts %} 循环显示每一篇文章。

5.5运行博客应用

  1. 将 app.py 和 index.html 保存到相应文件夹中。
  2. 在命令行中运行 Flask 应用:
    python app.py
  3. 访问 http://127.0.0.1:5000/,你将看到一个简单的博客界面,能够提交文章并查看已发布的内容。

注意
和前面的实验一起做的时候这里可能访问报错,如果有错误,清理一下缓存即可。

你可能感兴趣的:(flask,python,后端)