我正在使用瓶子构建一个小型的微型Web应用程序。第一步是用户将ID输入表单以便检索记录。一旦ID被验证为SQLite数据库的一部分,将采取进一步的步骤,他们可以修改记录,使用相同的PRIMARY KEY将数据添加到另一个.db,依此类推。
我的问题是,在会话中如何在验证后保留ID并将其传递给各种功能。它应该是在验证用户输入的函数内部创建的全局吗?我对全局变量持谨慎态度,只因为有很多垃圾被人们讨论过。另外,我很紧张,如果管理不善,用户可以重新启动会话,输入新数据,但全局ID变量可能没有被妥善处理等....
解决这个问题的正确方法是什么?
我不确定它有用,但这是我目前使用的代码....
import bottle as bt
import webbrowser as wb
import re, sqlite3
@bt.route('/welcome', method = 'GET')
def welcome():
return """
<!DOCTYPE html>
<html>
<head>
<title>Bottle Micro-Web Test Application</title>
</head>
<body>
<div style="text-align:center;">
<h1>Welcome to the Factory Database Test Micro-Web Application</h1>
<div/>
<div style="text-align:left;">
<h2>To call up a record please enter a valid UID in the box below:<h2>
<div/>
<form action="/welcome/result" method="post">
UID: <input type="text" name="UID"><br/>
<input value="Get Records" type="submit">
</form>
<body>
<html>
"""
@bt.route('/welcome/result', method = 'POST')
def report_welcome():
uid = bt.request.forms.get('UID')
return check_user_input(uid)
def check_user_input(uid):
uid_pattern = re.compile("[Mm]\d\d\d")
if not uid_pattern.match(uid):
return """
<!DOCTYPE html>
<html>
<head>
<title>Bottle Micro-Web Test Application</title>
</head>
<body>
<font size="6" color="red">That was an invalid UID!</font>
<p> A valid UID has the form M001</p>
<form action="http://localhost:8080/welcome">
<input type="submit" value="Back">
</form>
<body>
<html>
"""
else:
uid = uid.upper()
conn = sqlite3.connect('factories.db')
c = conn.cursor()
result = tuple(c.execute("SELECT uid FROM factories WHERE uid = ?", (uid,)))
if result:
c.execute("SELECT * FROM factories WHERE uid = ?", (uid,))
record = c.fetchone()
conn.close()
return bt.template("{{record}}", record = str(record))
else:
return """
<!DOCTYPE html>
<html>
<head>
<title>Bottle Micro-Web Test Application</title>
</head>
<body>
<font size="6" color="red">That UID does not exist in the database</font>
<form action="http://localhost:8080/welcome">
<input type="submit" value="Back">
</form>
<body>
<html>
"""
wb.open('http://localhost:8080/welcome')
bt.run(host = 'localhost', port = 8080, debug = True)
答案 0 :(得分:0)
如果你想将id用于单个请求,那么传递你想要做的局部变量比使用全局变量更好。
如果要保留请求中的id,可以将值保存在cookie中(如果不考虑id的安全性),则可以轻松访问它。 Cookie将保存在用户的计算机上,并且只能在请求期间访问。有关在瓶子中使用cookie的更多信息,请参阅瓶子的文档(在教程中对此进行了解释)。
另外:不要在代码中嵌入html使用模板!它会让你的代码更整洁。