如何在函数外部声明整数

时间:2019-06-12 08:58:19

标签: python mysql python-3.x http flask

我正在尝试通过HTTP发布请求将数据添加到我的mysql数据库中,但是按照现在设置的方式,如果我们多次发布,则第一次发布的数据将更改为0,因为我声明了所有变量的定义相同。我该如何解决?

我试图在第二个def中声明一个全局变量,但是它只是循环该def,而不是我现在拥有的那个。

current[IndexKey]

上一篇文章的值更改为0,但我想保留该值

1 个答案:

答案 0 :(得分:0)

似乎您想将定义的变量保留在函数的顶部(hits1hits2 ...)。正如您所说,问题在于每次调用函数时都会重新定义这些变量。

最简单的方法(尽管设计有问题)是使用全局变量。要定义全局变量,您可以执行以下操作:

hits1 = 0
hits2 = 0
# ...

@app.route('/post', methods = ["POST"])
def post():
    global hits1, hits2

    # ...

这样,将在请求之间保留值。我(个人)更喜欢的一种方法(尽管仍然是同一主意)是将数据保存在“存储”类中:

class Storage:
    hits1 = 0
    hits2 = 0
    # ...

@app.route('/post', methods = ["POST"])
def post():
    # Instead of just using hits1, hits2, ...
    # We now use Storage.hits1, ...
    # Example:

    # ...

    Storage.points1 = Storage.punch1 + Storage.kick1 * 2 + Storage.takedown1 * 3

    # ...

那行得通。但是当然,每次重新启动Flask应用程序时都会忘记这一点。如果您想要实际的持久性(这是您在使用数据库时要达到的目标),那么它将在每次用户时查询数据库(可能使用缓存来限制查询数量)向您的服务器发出请求:

class Database:
    def __init__(self):
        # Connect to your database
        self._hits1 = None

    @property
    def hits1(self):
        if self._hits1 is None:
            # self._hits1 = (Load data from the database)

        return self._hits1

    # ...

database = Database()

@app.route('/post', methods = ["POST"])
def post():
    # Loads from the database
    hits1 = database.hits1

    # ...

    # In this case, you'd probably want to move your INSERT query to your database class

一些评论:如果您想在请求之间保留值,那么可能是您想要UPDATE数据库而不是INSERT处理数据(但这仅仅是我对您代码的解释)。

此外,使用an_sql_request.format(data)是非常糟糕的做法,因为它可以帮助潜在的SQL注入。大多数数据库驱动程序都提供了一种准备查询的方法。例如使用mysql.connector

cur = connection.cursor()
sql = "INSERT INTO MyTable (Col1, Col2) VALUES (%s, %s)"
cur.execute(sql, (value_for_col1, value_for_col2))