Flask-如何重用URL参数替换功能?

时间:2019-09-09 14:34:18

标签: python flask

我正在尝试构建一个视图类,该类基于字符串自动构建重定向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有关,我找不到执行此部分的方法。

2 个答案:

答案 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'的视图的名称。

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

答案 1 :(得分:1)

似乎您正在寻找类似于url_for的东西。该函数的行为与您要查找的实现有点不同,它期望您尝试替换url的路由的函数名,但可能会给您一些实现思路。这是指向source code的链接。从外观上看,此调用将在第357行建立网址。

rv = url_adapter.build(endpoint, values, method=method, force_external=external)

看来url_adapter是从应用程序或请求上下文派生的,这意味着您可以使用RedirectView类中的适配器来避免再次对功能进行编码。