我正在尝试构建一个视图类,该类基于字符串自动构建重定向URL,例如:
class DeleteBook(RedirectView):
route = "/library/<int:library_id>/book/<int:book_id>/delete"
redirect_url = "/library/<int:library_id>/book"
def context(self, library_id, book_id):
book = Book(book_id)
book.delete()
还有RedirectView
(请注意,BaseView
对于这个问题并不重要)
class RedirectView(BaseView):
def replace_parameters(self, url, **params):
raise NotImplementedError()
def get(self, **params):
try:
self.context(**params)
flash('Book deleted')
except:
flash('Could not delete book')
finally:
redirect_url = self.replace_parameters(self.redirect_url, params)
return redirect(redirect_url)
如何在我的replace_parameters
类中实现RedirectView
,使其行为与Flask的route参数替换功能完全一样?
我认为这个问题主要与了解Flask内部API有关,我找不到执行此部分的方法。
答案 0 :(得分:2)
使用url_for
是最容易做的事情。使用它的目的是将代码与URL分离,您只需引用视图/路线名称即可。
在您分享的特定情况下,它看起来像这样:
class DeleteBook(RedirectView):
route = "/library/<int:library_id>/book/<int:book_id>/delete"
redirect_route = 'library_books'
def context(self, library_id, book_id):
book = Book(book_id)
book.delete()
class RedirectView(BaseView):
def get(self, **params):
try:
self.context(**params)
flash('Book deleted')
except:
flash('Could not delete book')
finally:
return redirect(url_for(redirect_view, params))
library_books
是处理url'/ library // book'的视图的名称。
Here是url_for
的API参考文档。它可以处理带有路径变量名称的关键字参数。
答案 1 :(得分:1)
似乎您正在寻找类似于url_for
的东西。该函数的行为与您要查找的实现有点不同,它期望您尝试替换url的路由的函数名,但可能会给您一些实现思路。这是指向source code的链接。从外观上看,此调用将在第357行建立网址。
rv = url_adapter.build(endpoint, values, method=method, force_external=external)
看来url_adapter
是从应用程序或请求上下文派生的,这意味着您可以使用RedirectView
类中的适配器来避免再次对功能进行编码。