广告位联系
返回顶部
分享到

使用Python和Flask编写一个留言簿

python 来源:互联网 作者:佚名 发布时间:2024-12-16 22:34:25 人浏览
摘要

在本文中,我们将通过创建一个简单的留言簿应用来入门Flask。这个项目将帮助我们理解Flask的基本概念和功能,如路由、模板、表单处理等。如果你是一个Python新手,或者第一次尝试使用Fla

在本文中,我们将通过创建一个简单的留言簿应用来入门Flask。这个项目将帮助我们理解Flask的基本概念和功能,如路由、模板、表单处理等。如果你是一个Python新手,或者第一次尝试使用Flask,不用担心,本文会一步步带你完成这个项目。

1. 环境准备

首先,你需要确保你的计算机上安装了Python和pip。接着,我们需要安装Flask。在命令行中运行以下命令:

1

pip install Flask

如果你打算使用数据库,可以选择SQLite(内置于Python标准库),或者安装一个更强大的数据库如MySQL或PostgreSQL。为了简化,我们在这个项目中使用SQLite。

2. 创建Flask应用

在你的工作目录下创建一个新文件,命名为app.py。这个文件将包含我们的Flask应用代码。

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

from flask import Flask, render_template, request, redirect, url_for

import sqlite3

  

app = Flask(__name__)

  

# 配置数据库连接

DATABASE = 'guestbook.db'

  

def get_db_connection():

    conn = sqlite3.connect(DATABASE)

    conn.row_factory = sqlite3.Row

    return conn

  

def init_db():

    conn = get_db_connection()

    c = conn.cursor()

    c.execute('''CREATE TABLE IF NOT EXISTS messages (

                    id INTEGER PRIMARY KEY AUTOINCREMENT,

                    name TEXT NOT NULL,

                    message TEXT NOT NULL,

                    timestamp TEXT NOT NULL

                )''')

    conn.commit()

    conn.close()

  

# 初始化数据库

if __name__ == '__main__':

    init_db()

3. 创建路由和视图函数

接下来,我们需要定义一些路由和视图函数来处理用户请求。

1

2

3

4

5

6

7

8

@app.route('/')

def index():

    conn = get_db_connection()

    c = conn.cursor()

    c.execute('SELECT * FROM messages ORDER BY timestamp DESC')

    messages = c.fetchall()

    conn.close()

    return render_template('index.html', messages=messages)

上面的代码定义了一个路由/,当用户访问这个URL时,会调用index视图函数。这个函数会从数据库中获取所有留言,并按时间降序排列,然后将它们传递给模板index.html。

4. 创建模板

在Flask中,模板用于生成HTML。在你的工作目录下创建一个文件夹,命名为templates。在这个文件夹中创建一个文件,命名为index.html。

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

<!doctype html>

<html lang="en">

  <head>

    <meta charset="utf-8">

    <meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no">

    <title>留言簿</title>

    <link href="https://stackpath.bootstrapcdn.com/bootstrap/4.5.2/css/bootstrap.min.css" rel="stylesheet">

  </head>

  <body>

    <div class="container mt-5">

      <h1 class="mb-4">留言簿</h1>

      <form method="post" action="/add_message">

        <div class="form-group">

          <label for="name">姓名</label>

          <input type="text" class="form-control" id="name" name="name" required>

        </div>

        <div class="form-group">

          <label for="message">留言</label>

          <textarea class="form-control" id="message" name="message" rows="3" required></textarea>

        </div>

        <button type="submit" class="btn btn-primary">提交</button>

      </form>

      <hr>

      <div class="list-group">

        {% for message in messages %}

          <a href="#" class="list-group-item list-group-item-action">

            <h5 class="mb-1">{{ message['name'] }}</h5>

            <p class="mb-1">{{ message['message'] }}</p>

            <small>{{ message['timestamp'] }}</small>

          </a>

        {% endfor %}

      </div>

    </div>

    <script src="https://code.jquery.com/jquery-3.5.1.slim.min.js"></script>

    <script src="https://cdn.jsdelivr.net/npm/@popperjs/core@2.9.2/dist/umd/popper.min.js"></script>

    <script src="https://stackpath.bootstrapcdn.com/bootstrap/4.5.2/js/bootstrap.min.js"></script>

  </body>

</html>

这个模板使用Bootstrap来美化表单和留言列表。表单的action属性设置为/add_message,这意味着当用户提交表单时,会向这个URL发送POST请求。

5. 处理表单提交

现在,我们需要定义一个视图函数来处理表单提交。

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

from datetime import datetime

  

@app.route('/add_message', methods=['POST'])

def add_message():

    name = request.form['name']

    message = request.form['message']

    timestamp = datetime.utcnow().isoformat()

  

    conn = get_db_connection()

    c = conn.cursor()

    c.execute('INSERT INTO messages (name, message, timestamp) VALUES (?, ?, ?)', (name, message, timestamp))

    conn.commit()

    conn.close()

  

    return redirect(url_for('index'))

在这个视图函数中,我们从request.form中获取表单数据,然后将其插入到数据库中。最后,我们使用redirect函数将用户重定向到首页。

6. 运行应用

现在,你可以运行你的Flask应用了。在命令行中,导航到你的app.py文件所在的目录,然后运行以下命令:

1

python app.py

默认情况下,Flask应用会在http://127.0.0.1:5000/上运行。打开你的浏览器,访问这个URL,你应该能看到你的留言簿应用。

7. 添加样式和功能(可选)

虽然我们的留言簿应用现在已经可以工作了,但你可以通过添加一些样式和功能来使其更加完善。

验证和错误处理:你可以添加一些验证逻辑来确保用户输入的数据是有效的。例如,你可以检查姓名和留言是否为空,或者限制留言的长度。

分页:如果留言很多,你可以添加分页功能来让用户能够浏览更多的留言。

用户身份验证:你可以添加用户身份验证功能来限制只有注册用户才能留言。

删除和编辑留言:你可以添加删除和编辑留言的功能。

部署:你可以将你的应用部署到一个服务器上,让其他人能够访问它。

8. 示例:添加验证和错误处理

下面是一个简单的示例,展示了如何在表单提交时添加验证和错误处理。

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

from flask import flash

  

@app.route('/add_message', methods=['POST'])

def add_message():

    name = request.form['name'].strip()

    message = request.form['message'].strip()

  

    if not name or not message:

        flash('姓名和留言都不能为空。', 'error')

        return redirect(url_for('index'))

  

    if len(message) > 500:

        flash('留言不能超过500个字符。', 'error')

        return redirect(url_for('index'))

  

    timestamp = datetime.utcnow().isoformat()

  

    conn = get_db_connection()

    c = conn.cursor()

    c.execute('INSERT INTO messages (name, message, timestamp) VALUES (?, ?, ?)', (name, message, timestamp))

    conn.commit()

    conn.close()

  

    flash('留言已成功添加。', 'success')

    return redirect(url_for('index'))

在这个示例中,我们使用了strip()方法来去除用户输入的前后空格,并检查姓名和留言是否为空。我们还检查了留言的长度,如果超过了500个字符,就会显示一个错误消息。我们使用flash函数来显示这些消息,这些消息会在模板中通过get_flashed_messages()函数来获取。

在index.html模板中,你可以添加以下代码来显示这些消息:

1

2

3

4

5

6

7

8

9

10

11

12

13

{% with messages = get_flashed_messages(with_categories=true) %}

  {% if messages %}

    <div class="alert alert-info alert-dismissible fade show" role="alert">

      {% for category, message in messages %}

        <strong>{{ category.capitalize() }}!</strong> {{ message }}

        <button type="button" class="close" data-dismiss="alert" aria-label="Close">

          <span aria-hidden="true">&times;</span>

        </button>

      {% endfor %}

    </div>

  {% endif %}

  

{% endwith %}

将上述代码添加到你的 index.html 模板的 <body> 标签内,通常位于 <div class="container mt-5"> 之前,这样 Flash 消息就会在页面顶部显示。这个代码块使用了 Jinja2 模板引擎的 with 语句来创建一个本地作用域,其中 messages 变量包含了通过 get_flashed_messages(with_categories=true) 获取的 Flash 消息及其类别。然后,使用一个循环来遍历这些消息,并根据类别(如 'error' 或 'success')显示不同的样式。

完整的 index.html 模板应该如下所示(仅展示关键部分):

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

<!doctype html>

<html lang="en">

  <head>

    <!-- 省略之前的头部信息 -->

  </head>

  <body>

    <!-- Flash 消息显示区域 -->

    {% with messages = get_flashed_messages(with_categories=true) %}

      {% if messages %}

        <div class="alert alert-info alert-dismissible fade show" role="alert">

          {% for category, message in messages %}

            <strong>{{ category.capitalize() }}!</strong> {{ message }}

            <button type="button" class="close" data-dismiss="alert" aria-label="Close">

              <span aria-hidden="true">&times;</span>

            </button>

          {% endfor %}

        </div>

      {% endif %}

    {% endwith %}

     

    <!-- 省略之前的留言簿容器和表单 -->

     

    <!-- 省略之前的脚本引用 -->

  </body>

</html>

这样,当用户提交表单时,如果验证失败,就会显示相应的错误消息。如果验证成功,就会显示成功消息,并将用户重定向回首页。

9. 进一步优化

虽然我们的留言簿应用已经具备基本功能,但还有很多可以优化的地方,比如:

CSS 样式:你可以自定义 CSS 样式来使应用更符合你的品牌或主题。

JavaScript:使用 JavaScript 可以增强用户体验,比如表单验证、动态加载更多留言等。

安全性:考虑使用 Flask-WTF 或 Flask-Security 等库来增强表单验证和安全性。

测试:编写单元测试来确保你的代码在不同情况下都能正常工作。

部署:使用 Gunicorn、uWSGI 等 WSGI 服务器来部署你的应用,并使用 Nginx 或 Apache 作为反向代理。

10. 部署到生产环境

当你准备好将应用部署到生产环境时,你可以考虑以下步骤:

选择服务器:选择一个可靠的服务器提供商,比如 AWS、Google Cloud、Heroku 等。

配置环境:在服务器上安装必要的软件和库,比如 Python、Flask、数据库等。

设置虚拟环境:使用 venv 或 virtualenv 来创建和管理 Python 虚拟环境。

部署代码:将你的代码上传到服务器,并配置 WSGI 服务器来运行你的 Flask 应用。

配置数据库:在生产环境中配置数据库连接,并确保数据库迁移已经应用。

测试:在生产环境中测试你的应用,确保一切正常工作。

监控和维护:使用监控工具来跟踪应用的性能和稳定性,并定期进行维护和更新。


版权声明 : 本文内容来源于互联网或用户自行发布贡献,该文观点仅代表原作者本人。本站仅提供信息存储空间服务和不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权, 违法违规的内容, 请发送邮件至2530232025#qq.cn(#换@)举报,一经查实,本站将立刻删除。
原文链接 :
相关文章
  • Python在PDF中添加或删除超链接的操作

    Python在PDF中添加或删除超链接的操作
    PDF文件现已成为文档存储和分发的首选格式。然而,PDF文件的静态特性有时会限制其交互性。超链接是提高PDF文件互动性和用户体验的关键
  • 从基础到进阶带你玩转Python中的JSON
    在Python中处理JSON数据是日常开发中的常见任务之一。JSON(JavaScript Object Notation)是一种轻量级的数据交换格式,在Web开发、数据存储等多个
  • 基于Python开发一个Instant Messaging(IM)聊天工具
    在现代社会中,即时通讯工具已经成为人们日常沟通的重要工具。开发一个IM聊天工具不仅能够提高我们的编程技能,还能让我们更好地理解
  • 使用Python和Flask编写一个留言簿
    在本文中,我们将通过创建一个简单的留言簿应用来入门Flask。这个项目将帮助我们理解Flask的基本概念和功能,如路由、模板、表单处理等
  • python makedirs() 递归创建目录介绍
    在 Python 中,os.makedirs() 函数用于递归地创建目录。也就是说,它不仅会创建指定的目录,还会创建任何必要的父目录。这个函数在处理需要
  • 基于Python构建深度学习图像分类模型
    在人工智能的浪潮中,图像分类作为计算机视觉领域的基础任务之一,一直备受关注。随着深度学习技术的快速发展,基于Python的深度学习
  • python3.12.7降级到3.10.0的方法
    先将Python 3.12.7 降级到 3.10.0,然后将3.10.0版本设置为默认版本 步骤一: 要将 Python 从 3.12.7 降级到 3.10.0,你可以使用以下方法: 方法 1:从
  • Python数据可视化中常见的4种标注方式及示例

    Python数据可视化中常见的4种标注方式及示例
    常见的标注方式 文本标注 箭头标注 突出标注 趋势线标注 让我们通过Python实现来了解所有这些用于数据可视化的标注技术。 文本标注 文本
  • Python KeyError异常的原因及问题解决
    什么是 KeyError 异常? 在 Python 中,KeyError异常是内置异常之一,具体来说,KeyError是当试图获取字典中不存在的键时,引发的异常。作为参考
  • Python图形化工具对比
    Tkinter:Python内置的图形化库 Tkinter是Python的标准GUI库,它简单易用,适合初学者。Tkinter提供了创建窗口、按钮、文本框等常见控件的功能,
  • 本站所有内容来源于互联网或用户自行发布,本站仅提供信息存储空间服务,不拥有版权,不承担法律责任。如有侵犯您的权益,请您联系站长处理!
  • Copyright © 2017-2022 F11.CN All Rights Reserved. F11站长开发者网 版权所有 | 苏ICP备2022031554号-1 | 51LA统计