使用 Flask 和 MySQL 创建事件管理器

Posted

技术标签:

【中文标题】使用 Flask 和 MySQL 创建事件管理器【英文标题】:Creating an events manager using Flask and MySQL 【发布时间】:2018-05-15 22:15:57 【问题描述】:

我是一名 Python 和 javascript 程序员新手,目前正在使用 Flask 和 mysql 创建一个事件管理器应用程序。

单页网站应允许用户:

    添加和查看事件。 按日期或类别对事件进行排序

我似乎无法将数据插入本地 MySQL 数据库。每次我打开 MySQL 工作台检查时,表都是空的。

我的问题是:

    如何使用 Flask 将输入标签中的数据插入 MySQL? 如果插入成功,检查 MySQL 的最佳方法是什么? 如何在应用启动时使用 Flask 从 MySQL 获取数据到 html 表中?

HTML:

<!DOCTYPE html>
<head>
    <meta charset="UTF-8">
    <link rel = 'stylesheet' href = 'https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/css/bootstrap.min.css'>
    <title>Events and Opportunities</title>
</head>
<body>
    <div class = 'container'>
        <h1>Events and Opportunities</h1>
        <table class="table">
            <thead>
                <tr id = 'tableHeader'>
                    <th>Date</th>
                    <th>Category</th>
                    <th>Title</th>
                    <th>Description</th>
                </tr>
            </thead>
            <tbody>
                <form action = '/' method = 'post'>
                    <tr id = 'tableInput'>
                        <td><input type = 'date' name = 'inputDate' id = 'inputDate'></td>
                        <td><input type = 'text' name = 'inputCategory' id = 'inputCategory' maxlength = '20'></td>
                        <td><input type = 'text' name = 'inputTitle' id = 'inputTitle' maxlength = '100'></td>
                        <td><input type = 'text' name = 'inputDescription' id = 'inputDescription' maxlength = '500'></td>
                    </tr>
                </form>
            </tbody>
        </table>
        <button type = 'button' id = 'addButton' class="btn btn-default">Add</button>
    </div>
    <script src = 'https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/js/bootstrap.min.js'></script>
    <script
        src="https://code.jquery.com/jquery-3.2.1.min.js"
        integrity="sha256-hwg4gsxgFZhOsEEamdOYGBf13FyQuiTwlAQgxVSNgt4="
        crossorigin="anonymous">
    </script>
    <script src = 'static/app.js'></script>
</body>
</html>

Javascript:

$('#addButton').on('click', () => 
    if ($('#inputDate').val() === '' || $('#inputCategory') === '' || $('#inputTitle') === '' || $('#inputDescription') === '')
        alert('Please fill in the form.');
    
    else
        const valDate = $('<th></th>').text($('#inputDate').val());
        const valCategory = $('<th></th>').text($('#inputCategory').val());
        const valTitle = $('<th></th>').text($('#inputTitle').val());
        const valDescription = $('<th></th>').text($('#inputDescription').val());

        const newRow = $('<tr></tr>').append(valDate, valCategory, valTitle, valDescription);
        $('#tableInput').before(newRow);

        $('#inputDate').val('');
        $('#inputCategory').val('');
        $('#inputTitle').val('');
        $('#inputDescription').val('');
    
)

Flask 代码:

from flask import Flask, render_template, request
import mysql.connector

app = Flask(__name__)
cnx = mysql.connector.connect(user='root', password='yunani', host='127.0.0.1',  database='test')
cursor = cnx.cursor()

@app.route('/', methods = ['GET', 'POST'])
def index():
    return render_template('index.html')
    if request.method == 'POST':
        date = request.form['inputDate']
        category = request.form['inputCategory']
        title = request.form['inputTitle']
        description = request.form['inputDescription']
        cursor.execute('INSERT INTO data (Date, Category, Title, Description) VALUES (, , , )'.format(date, category, title, description))
        cnx.commit()

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

MySQL 架构:link to image

【问题讨论】:

你好像没有办法提交表单,所以它实际上调用了Flask代码。 【参考方案1】:

尝试将您的处理程序更改为

def index():
    if request.method == 'POST':
        date = request.form['inputDate']
        category = request.form['inputCategory']
        title = request.form['inputTitle']
        description = request.form['inputDescription']
        cursor.execute('INSERT INTO data (Date, Category, Title, Description) VALUES (, , , )'.format(date, category, title, description))
        cnx.commit()
    return render_template('index.html')  # don't do this at the top

您目前在检查呼叫类型或与数据库通话之前返回。

【讨论】:

不要认为else 子句是必要的:post 请求仍然需要返回一些 IIRC,因此将 if 然后 return 放在 if 之外应该呈现两种情况下的模板。不过我可能错了 @Mangohero1 你说得对。我在想post 是一个ajax 请求,所以不希望渲染模板,但事实并非如此。谢谢:)

以上是关于使用 Flask 和 MySQL 创建事件管理器的主要内容,如果未能解决你的问题,请参考以下文章

flask怎样查询mysql并显示在页面上

Flask中使用mysql

Flask小demo---代码统计系统

Flask-SQLAlchemy 和 Gevent 没有关闭 mysql 连接

flask管理员登录后台

用 Flask 来写个轻博客 — (M)VC_Alembic 管理数据库结构的升级和降级