📜  使用 Bottle 框架的笑话应用程序Python(1)

📅  最后修改于: 2023-12-03 15:06:45.360000             🧑  作者: Mango

使用 Bottle 框架的笑话应用程序

Bottle 是一个快速、简单,也很容易学习的 Python Web 框架。在本篇文章中,我们将使用 Bottle 框架开发一个笑话应用程序。

功能

本笑话应用程序将会有以下功能:

  1. 首页:展示所有笑话。
  2. 具体笑话页面:展示单个笑话的详细信息。
  3. 添加笑话页面:用户可以提交自己的笑话。
  4. 随机笑话页面:展示随机的笑话。
环境

开发本应用程序需要的环境如下:

  • Python 3.x
  • Bottle 框架
  • SQLite
数据库结构

本应用程序将使用 SQLite 作为数据库。我们将使用以下表格:

jokes

|字段|类型|描述| |----|----|----| |id|INTEGER|笑话的 ID| |content|TEXT|笑话内容| | posted_on|DATETIME|上传时间|

添加笑话表单

我们使用以下表单添加笑话:

|字段|类型|描述| |----|----|----| |content|TEXT|笑话内容|

代码

首先,我们需要导入需要用到的模块。

import sqlite3
from bottle import route, run, template, request
数据库连接

接下来是数据库连接:

# 连接数据库
conn = sqlite3.connect('jokes.db')

# 创建 jokes 表格
conn.execute('''CREATE TABLE IF NOT EXISTS jokes (
    id INTEGER PRIMARY KEY AUTOINCREMENT,
    content TEXT NOT NULL,
    posted_on DATETIME NOT NULL
);''')

# 关闭数据库
conn.close()

# 添加新笑话
def insert_joke(content):
    conn = sqlite3.connect('jokes.db')
    conn.execute("INSERT INTO jokes (content,posted_on) VALUES (?,datetime('now'))", (content,))
    conn.commit()
    conn.close()
首页

接着是首页:

@route('/')
def index():
    conn = sqlite3.connect('jokes.db')
    jokes = conn.execute('SELECT * FROM jokes;').fetchall()
    conn.close()
    return template('index', jokes=jokes)

我们使用 SELECT * FROM jokes 从数据库中获取所有笑话,并使用 template 函数渲染 HTML 模板。我们使用 jokes 参数将笑话传递到 HTML 模板中。

具体笑话页面

然后是展示单个笑话页面:

@route('/joke/<joke_id:int>')
def joke(joke_id):
    conn = sqlite3.connect('jokes.db')
    joke = conn.execute('SELECT * FROM jokes WHERE id=?', (joke_id,)).fetchone()
    conn.close()
    return template('joke', joke=joke)

我们使用 SELECT * FROM jokes WHERE id=? 根据笑话的 ID 从数据库中获取单个笑话,并使用 template 函数渲染 HTML 模板。我们使用 joke 参数将笑话传递到 HTML 模板中。

添加笑话页面

之后是添加笑话页面:

@route('/add_joke')
def add_joke():
    return template('add_joke')

使用 template 函数渲染 HTML 模板。在模板中定义表单。

<h2>Add Joke</h2>
<form action="/add_joke" method="post">
    <input type="text" name="content">
    <input type="submit" value="Submit">
</form>
处理添加笑话表单

接着是处理添加笑话表单:

@route('/add_joke', method='POST')
def do_add_joke():
    content = request.forms.get('content')
    insert_joke(content)
    return '<script>alert("Success!"); location.href="/"</script>'

我们使用 request.forms.get('content') 获取表单中输入的笑话内容。然后,我们调用 insert_joke 函数将笑话内容插入到数据库中。最后,使用 JavaScript 提示用户笑话添加成功,并跳转到首页。

随机笑话页面

最后是随机笑话页面:

@route('/random_joke')
def random_joke():
    conn = sqlite3.connect('jokes.db')
    joke = conn.execute('SELECT * FROM jokes ORDER BY RANDOM() LIMIT 1;').fetchone()
    conn.close()
    return template('joke', joke=joke)

我们使用 ORDER BY RANDOM() LIMIT 1 从数据库中获取一个随机笑话,并使用 template 函数渲染 HTML 模板。我们使用 joke 参数将笑话传递到 HTML 模板中。

HTML 模板

最后是 HTML 模板。我们使用以下模板:

index.tpl
<h2>All Jokes</h2>
<a href="/add_joke">Add Joke</a>
<a href="/random_joke">Random Joke</a>
<table>
    <thead>
        <tr>
            <th>ID</th>
            <th>Content</th>
            <th>Posted On</th>
        </tr>
    </thead>
    <tbody>
        %for joke in jokes:
        <tr>
            <td>{{joke[0]}}</td>
            <td>{{joke[1]}}</td>
            <td>{{joke[2]}}</td>
            <td><a href="/joke/{{joke[0]}}">View</a></td>
        </tr>
        %end
    </tbody>
</table>
joke.tpl
<h2>Joke</h2>
<p>{{joke[1]}}</p>
<p>Posted on {{joke[2]}}</p>
add_joke.tpl
<h2>Add Joke</h2>
<form action="/add_joke" method="post">
    <input type="text" name="content">
    <input type="submit" value="Submit">
</form>
运行

最后,我们使用以下代码运行应用程序:

if __name__ == '__main__':
    run()

默认情况下,应用程序将运行在 http://localhost:8080。打开浏览器并访问该地址。你会看到所有笑话的列表。

点击“Add Joke”链接将打开添加笑话页面。在表单中输入笑话内容,然后点击“Submit”按钮。笑话将被添加到数据库中,并跳转到首页。

点击笑话列表中的“View”链接将打开具体笑话页面。点击“Random Joke”链接将打开随机笑话页面。