首页 > 解决方案 > Flask - 如何重用 URL 参数替换功能?

问题描述

我正在尝试构建一个基于字符串自动构建重定向 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 的路由参数替换功能完全一样?

我认为这个问题主要与了解 Flask 内部 API 有关,我找不到执行这部分的方法。

标签: pythonflask

解决方案


使用url_for将是最 Flasky 的事情。使用它的目的是将您的代码与 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' 的视图的名称。

是 的 API 参考文档url_for。它可以处理带有路径变量名称的关键字参数。


推荐阅读