我正在开发一个烧瓶应用程序来管理一个库。我遇到的问题之一是增加新书。在许多情况下,存在“作者冲突”;本质上是将一本以"John“作为作者的书添加到数据库中,然后将另一本以"John”作为作者的书添加到数据库中。第一本书的作者“约翰·史密斯”和第二本书的作者是同样的“约翰·史密斯”吗?
我对这个问题的解决方案是有一个模态对话框,其中以作者姓名的形式呈现给用户“作者冲突”,以及当前数据库中归属于作者的图书列表。问题是我不知道如何实现这一点。我的第一个想法是重定向到另一个页面,用户将在新页面中回答这些问题。问题是,这需要一些看似unRESTful的设计,比如保存状态数据(用户已经输入的图书元数据的其余部分)。
我认为我应该做的是在LoanBook(MethodView)中实现某种"Post方法“,它会产生一系列模态对话框(每个作者冲突一次,因为书籍可以有多个作者),只有在每一次冲突都用‘是’或‘否’解决后才提交。
理想情况下,我希望能够停止Post方法(标记为:# ??? yield ???),等待用户的响应,然后根据响应运行代码。必要时再重复一遍。我不知道是否有一些烧瓶扩展或方法使这成为可能,或者这是可能的。还有别的方法我应该做吗?有人有什么建议吗?
class LoanBook(MethodView):
decorators = [login_required]
form = None
def __init__(self):
self.book = None
self.form = self.prep_form()
@permissions_required(Permission.CHECK_OUT_BOOK)
def get(self):
return render_template("library/loan_book.html", form=self.form)
@permissions_required(Permission.CHECK_OUT_BOOK)
def post(self):
if self.form.validate_on_submit():
if self.form.fill_ISBN.data:
# User has hit the fill data from ISBN button
pass
else:
try:
self.__make_book__()
db.session.add(self.book)
db.session.commit()
except InvalidRequestError:
db.session.rollback()
db.session.flush()
flash(FlashMessage.not_saved, FlashMessage.failure)
else:
auths = None
if len(loanedBook.authors) > 1:
auths = oxford_commatize(
[a.full_name() for a in loanedBook.authors]
)
else:
auths = loanedBook.authors[0].full_name()
flash(
FlashMessage.saved.format(loanedBook.title, auths),
FlashMessage.failure
)
return redirect(url_for("library.main"))
elif self.form.author_collisions:
uri_auth = []
for auth in self.form.author_collisions:
# ??? yield ???
self.__make_book__()
db.session.add(self.book)
db.session.commit()
else:
flash_errors(self.form)
return render_template("library/loan_book.html", form=self.form)发布于 2016-02-23 21:36:54
这不能单独在瓶中完成,除非,正如你所说的,你得到了一点RESTless.但是,一种方法是预先保存数据,并为正在创建的记录返回一个与标识符第一次冲突的页面。当输入作者的名字时,我会在AJAX或websocket连接中将冲突加载到页面( div)的另一个区域--如果您是完全无国籍的:)
我将使用websockets (实际上,socket.io是websockets的一个更实用的包装器),并使用一个JavaScript事件,当用户输入作者的名字时,该事件会在请求中触发。然后,可以使用来自websocket的JSON响应填充页面上的一个区域,并且可以在其中选择任何匹配的结果。在服务器端使用烧瓶-socketio;文档中有一个JavaScript示例,可以让您在浏览器端开始工作。
烧瓶-SocketIO的文档可以在这里找到:http://flask-socketio.readthedocs.org/en/latest/
下面是一个很好的视频,展示了这方面的基础知识,并为所使用的代码进行了回购:https://www.youtube.com/watch?v=L5YQbNrFfyw
发布于 2016-02-23 21:23:27
在服务器端的连续操作之间进行用户干预的尝试不会有太大的成功。将这些冲突检测为初始页的异步组件以便用户能够在提交到此端点之前解决冲突的API可能是最好的。
https://stackoverflow.com/questions/35587425
复制相似问题