我运行书中的代码,并成功地将其部署到我的测试中,#deer; deerdog.me"网站作为门户网站。 有3个模块可供使用:注册,表创建和请求监视。
第一个用户注册模块是好的。
但是当使用新注册的id / pwd进入左上方登录表单时。 (在" home"提示,点击弹出窗口) 你看到第二个table_creating模块似乎很好。按输入的每个随机数在表格上创建。
但是错误就在这里,在这里你不应该触及第3个模块 - 请求,但是一旦你点击"仪表板"在上方的导航栏中。 在新页面中,奇怪的是你可以看到一个新的请求被隐身添加。 (理论上,请求行只能通过" add-request"功能添加,但现在不能添加#34; get-request"功能。
我发现的最大提示是我只提出了&#34;添加请求&#34;在@app.route("/newrequest/<tid>")
的路线下,甚至是路线@app.route("/account/createtable"...
,它只有&#34; get-request&#34;功能,可以在mongodb db.requests.()
中创建请求。
为什么会这样,请帮助我检查和修复。非常感谢。
第二个模块的操作逻辑(使用相同的#34; / account&#34;路径页面创建表格和显示, 激活动作==你输入一个空白的随机数(2,5或66,109)并点击&#34;创建按钮&#34; ,然后你会在同一个&#34; / account&#34;中看到行(包括一个shor url)。页。 第3个模块的操作逻辑(创建请求然后显示在&#39; / dashboard&#39;路由页面。)应该只在这种情况下激活(用户复制/ account路由页面表行中的短URL,然后ctrl + p短URl到一个新的浏览地址,然后在这个新的&#34; @ app.route(&#34; / newrequest /&#34;)下,mongodb中的请求开始合法创建&#34;,现在用户可以跳转第3个模块的操作逻辑。直接创建请求记录而不启动&#34; @ app.route(&#34; / newrequest /&#34;,为什么会发生这种情况?
#dbhelper.py as below
import pymongo
from bson.objectid import ObjectId
DATABASE = "waitercaller"
class DBHelper:
def __init__(self):
client = pymongo.MongoClient()
self.db = client[DATABASE]
def add_table(self, number, owner):
new_id = self.db.tables.insert({"number": number, "owner": owner})
return new_id
def update_table(self, _id, url):
self.db.tables.update({"_id": _id}, {"$set": {"url": url}})
def get_tables(self, owner_id):
return list(self.db.tables.find({"owner": owner_id}))
def get_table(self, table_id):
return self.db.tables.find_one({"_id": ObjectId(table_id)})
def delete_table(self, table_id):
self.db.tables.remove({"_id": ObjectId(table_id)})
def add_request(self, table_id, time):
table = self.get_table(table_id)
try:
self.db.requests.insert({"owner": table['owner'], "table_number": table[
'number'], "table_id": table_id, "time": time})
return True
except pymongo.errors.DuplicateKeyError:
return False
def get_requests(self, owner_id):
return list(self.db.requests.find({"owner": owner_id}))
def delete_request(self, request_id):
self.db.requests.remove({"_id": ObjectId(request_id)})
主要APP代码,名为waitercaller.py
waitercaller.py
...
@app.route("/")
def home():
#return "Under construction"
#return render_template("home.html")
#registrationform = RegistrationForm()
return render_template("home.html", loginform=LoginForm(), registrationform=RegistrationForm())
@app.route("/dashboard")
@login_required
def dashboard():
now = datetime.datetime.now()
requests = DB.get_requests(current_user.get_id())
for req in requests:
deltaseconds = (now - req['time']).seconds
req['wait_minutes'] = "{}.{}".format((deltaseconds/60), str(deltaseconds % 60).zfill(2))
return render_template("dashboard.html", resolvesubmitform=ResolveForm(),requests=requests)
@app.route("/dashboard/resolve")
@login_required
def dashboard_resolve():
form = ResolveForm(request.form)
request_id = request.args.get("request_id")
#if form.validate():
DB.delete_request(request_id)
return redirect(url_for('dashboard'))
#return render_template("dashboard.html", resolvesubmitform=ResolveForm(),requests=DB.get_requests(request_id))
@app.route("/account")
@login_required
def account():
tables = DB.get_tables(current_user.get_id())
return render_template("account.html", createtableform=CreateTableForm(), tables=tables)
@app.route("/account/createtable", methods=["POST"])
@login_required
def account_createtable():
form = CreateTableForm(request.form)
if form.validate():
tableid = DB.add_table(form.tablenumber.data, current_user.get_id())
new_url = BH.shorten_url(config.base_url + "newrequest/" + str(tableid))
DB.update_table(tableid, new_url)
return redirect(url_for('account'))
return render_template("account.html", createtableform=form, tables=DB.get_tables(current_user.get_id()))
@app.route("/account/deletetable")
@login_required
def account_deletetable():
tableid = request.args.get("tableid")
DB.delete_table(tableid)
return redirect(url_for('account'))
@app.route("/newrequest/<tid>")
def new_request(tid):
DB.add_request(tid, datetime.datetime.now())
return "Your request has been logged and a waiter will be with you shortly"
if __name__ == '__main__':
app.run(port=5000, debug=True)