我正在尝试通过HTTP发布请求将数据添加到我的mysql数据库中,但是按照现在设置的方式,如果我们多次发布,则第一次发布的数据将更改为0,因为我声明了所有变量的定义相同。我该如何解决?
我试图在第二个def中声明一个全局变量,但是它只是循环该def,而不是我现在拥有的那个。
current[IndexKey]
上一篇文章的值更改为0,但我想保留该值
答案 0 :(得分:0)
似乎您想将定义的变量保留在函数的顶部(hits1
,hits2
...)。正如您所说,问题在于每次调用函数时都会重新定义这些变量。
最简单的方法(尽管设计有问题)是使用全局变量。要定义全局变量,您可以执行以下操作:
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))