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

 更新时间:2024年12月15日 13:32:15   作者:傻啦嘿哟  
本文将通过创建一个简单的留言簿应用来入门Flask,这个项目可以帮助我们理解Flask的基本概念和功能,如路由、模板、表单处理等,感兴趣的可以了解下

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

1. 环境准备

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

pip install Flask

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

2. 创建Flask应用

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

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. 创建路由和视图函数

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

@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。

<!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. 处理表单提交

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

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文件所在的目录,然后运行以下命令:

python app.py

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

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

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

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

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

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

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

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

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

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

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模板中,你可以添加以下代码来显示这些消息:

{% 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 模板应该如下所示(仅展示关键部分):

<!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 应用。

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

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

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

到此这篇关于使用Python和Flask编写一个留言簿的文章就介绍到这了,更多相关Python Flask留言簿内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • python实现udp聊天窗口

    python实现udp聊天窗口

    这篇文章主要为大家详细介绍了python实现udp聊天窗口,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2020-03-03
  • 基于Pyinstaller打包Python程序并压缩文件大小

    基于Pyinstaller打包Python程序并压缩文件大小

    这篇文章主要介绍了基于Pyinstaller打包Python程序并压缩文件大小,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-05-05
  • Python NumPy库安装使用笔记

    Python NumPy库安装使用笔记

    这篇文章主要介绍了Python NumPy库安装使用笔记,本文讲解了NumPy的安装和基础使用,并对每一句代码都做了详细解释,需要的朋友可以参考下
    2015-05-05
  • python对配置文件.ini进行增删改查操作的方法示例

    python对配置文件.ini进行增删改查操作的方法示例

    .ini配置文件常被用作存储程序中的一些参数,通过它程序可以变得更加灵活。下面这篇文章主要给大家介绍了关于python对配置文件.ini进行增删改查操作的方法示例,文中通过示例代码介绍的非常详细,需要的朋友可以参考借鉴,下面来一起看看吧。
    2017-07-07
  • 利用pygame完成动画精灵和碰撞检测

    利用pygame完成动画精灵和碰撞检测

    这篇文章主要介绍了利用pygame完成动画精灵和碰撞检测,代码详细,内容丰富,对于想要学习pygame的朋友来讲是一个不错的练习,需要的朋友可以参考下
    2021-04-04
  • 一步步教你用python的scrapy编写一个爬虫

    一步步教你用python的scrapy编写一个爬虫

    这篇文章主要给大家介绍了如何利用python的scrapy编写一个爬虫的相关资料,文中通过示例代码介绍的非常详细,对大家学习或者使用scrapy具有一定的参考学习价值,需要的朋友们下面来一起学习学习吧
    2019-04-04
  • 不到20行实现Python代码即可制作精美证件照

    不到20行实现Python代码即可制作精美证件照

    这篇文章主要介绍了不到20行实现Python代码即可制作精美证件照,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-04-04
  • pyinstaller打包单文件时--uac-admin选项不起作用怎么办

    pyinstaller打包单文件时--uac-admin选项不起作用怎么办

    这篇文章主要介绍了pyinstaller打包单文件时--uac-admin选项不起作用怎么办,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-04-04
  • Python实现一行代码自动绘制艺术画

    Python实现一行代码自动绘制艺术画

    DiscoArt 是一个很牛的开源模块,它能根据你给定的关键词自动绘画。本文就将利用这一模块实现一行代码自动绘制艺术画,需要的可以参考一下
    2022-12-12
  • python中创建一个包并引用使用的操作方法

    python中创建一个包并引用使用的操作方法

    python包在开发中十分常见,一般通过导入包含特定功能的python模块包进行使用。当然,也可以自己创建打包模块,然后发布,安装使用,这篇文章主要介绍了python中如何创建一个包并引用使用,需要的朋友可以参考下
    2022-08-08

最新评论