交互式 Flask 提示
Interactive Flask Prompts
我正在开发一个用于管理图书馆的 Flask 应用程序。我遇到的问题之一与添加新书有关。在很多情况下有"author collisions";本质上,添加了一本作者为 "John Smith" 的书,然后将另一本作者为 "John Smith" 的书添加到数据库中。第一本书的作者"John Smith"和第二本书的作者"John Smith"一样吗?
我对这个问题的解决方案是使用模态对话框,在其中以作者姓名的形式向用户显示 "author collisions",以及当前数据库中属于该作者的书籍列表.问题是我不知道如何实现它。我的第一个想法是重定向到另一个页面,用户可以在新页面中回答这些问题。问题是这需要一些看似非 RESTful 的设计,比如保存状态数据(用户已经输入的书籍元数据的其余部分)。
我想我应该做的是在 LoanBook(MethodView)
中实现某种 "Post method" 产生一系列模式对话框(每个作者冲突一个,因为书籍可以有多个作者), 只有在每次冲突都用 'yes' 或 'no' 解决后才提交。
理想情况下,我希望能够停止 Post 方法(在标记点:# ??? yield ???
),等待用户的响应,然后 运行 基于代码在响应上。然后如有必要重复。我不知道是否有一些 Flask 扩展或方法使这成为可能,或者这是否可能。我应该采取另一种方法吗?有人有什么建议吗?
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)
尝试在服务器端的连续操作之间进行用户干预不会取得太大成功。 API 可以检测这些冲突作为初始页面的异步组件,以便用户可以在提交到此端点之前解决它们可能是最好的。
这不能单独在 Flask 中完成,除非像你说的那样,你变得有点 RESTless...但是一种方法是预先保存数据和 return 一个与第一个冲突的页面您正在创建的记录的标识符。当输入作者姓名时,我会插入一点 AJAX 或加载页面另一区域冲突的 websocket 连接(div)——如果你执意要完全无状态:)
我会使用 websockets(实际上,socket.io,它是 websockets 的一个更实用的包装器),当用户输入作者姓名时,JavaScript 事件会在请求中触发。然后可以使用来自 websocket 的 JSON 响应来填充页面上的一个区域,并且可以在那里选择任何匹配的结果。在服务器端使用 flask-socketio;文档中有一个 JavaScript 示例,可以让您在浏览器端开始使用。
可以在此处找到 Flask-SocketIO 的文档:
http://flask-socketio.readthedocs.org/en/latest/
这是一个展示此基础知识的优秀视频,其中包含所用代码的回购协议:
https://www.youtube.com/watch?v=L5YQbNrFfyw
我正在开发一个用于管理图书馆的 Flask 应用程序。我遇到的问题之一与添加新书有关。在很多情况下有"author collisions";本质上,添加了一本作者为 "John Smith" 的书,然后将另一本作者为 "John Smith" 的书添加到数据库中。第一本书的作者"John Smith"和第二本书的作者"John Smith"一样吗?
我对这个问题的解决方案是使用模态对话框,在其中以作者姓名的形式向用户显示 "author collisions",以及当前数据库中属于该作者的书籍列表.问题是我不知道如何实现它。我的第一个想法是重定向到另一个页面,用户可以在新页面中回答这些问题。问题是这需要一些看似非 RESTful 的设计,比如保存状态数据(用户已经输入的书籍元数据的其余部分)。
我想我应该做的是在 LoanBook(MethodView)
中实现某种 "Post method" 产生一系列模式对话框(每个作者冲突一个,因为书籍可以有多个作者), 只有在每次冲突都用 'yes' 或 'no' 解决后才提交。
理想情况下,我希望能够停止 Post 方法(在标记点:# ??? yield ???
),等待用户的响应,然后 运行 基于代码在响应上。然后如有必要重复。我不知道是否有一些 Flask 扩展或方法使这成为可能,或者这是否可能。我应该采取另一种方法吗?有人有什么建议吗?
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)
尝试在服务器端的连续操作之间进行用户干预不会取得太大成功。 API 可以检测这些冲突作为初始页面的异步组件,以便用户可以在提交到此端点之前解决它们可能是最好的。
这不能单独在 Flask 中完成,除非像你说的那样,你变得有点 RESTless...但是一种方法是预先保存数据和 return 一个与第一个冲突的页面您正在创建的记录的标识符。当输入作者姓名时,我会插入一点 AJAX 或加载页面另一区域冲突的 websocket 连接(div)——如果你执意要完全无状态:)
我会使用 websockets(实际上,socket.io,它是 websockets 的一个更实用的包装器),当用户输入作者姓名时,JavaScript 事件会在请求中触发。然后可以使用来自 websocket 的 JSON 响应来填充页面上的一个区域,并且可以在那里选择任何匹配的结果。在服务器端使用 flask-socketio;文档中有一个 JavaScript 示例,可以让您在浏览器端开始使用。
可以在此处找到 Flask-SocketIO 的文档: http://flask-socketio.readthedocs.org/en/latest/
这是一个展示此基础知识的优秀视频,其中包含所用代码的回购协议: https://www.youtube.com/watch?v=L5YQbNrFfyw