我正在关注这个 Flaskappbuilder 示例。但是,当我想路由到不同的网址时,例如对于
method3
中的views.py
,如果我想路由到/method3/jonh
而不是myview/method3/jonh
,它将返回错误:the requested url was not found on the server. if you entered the url manually please check your spelling and try again.
我不明白为什么我们需要myview
?我如何路由到与示例不同的 url?
在
views.py
中,我将appbuilder.add_link("Method3", href='/myview/method3/jonh', category='My View')
更改为appbuilder.add_link("Method3", href='/method3/jonh', category='My View')
。如果你把它改成任何其他的,比如appbuilder.add_link("Method3", href='/myview1/method3/jonh'
,也会发生同样的错误。
您遇到了一些事情。
首先,BaseView 类的构造函数将使用类名将 Flask 上公开的 url 注册为蓝图,除非通过设置 Route_base 进行覆盖。所以在这个例子中,MyView 的 URL 是 /myview/... 除非你专门设置它。
其次,add_link 只是将 href 中的任何内容添加到菜单中 - 它不会创建或定义任何内容,只是指向 href。你可以 href = "/foo" 它只会尝试将你发送到那里。如果它不存在,任何服务器(在本例中为 Flask 的)都会以 Not Found 的方式响应。
这个例子试图说明你不必调用add_view三次,因为BaseView是在你第一次调用它时构造的。之后,您就可以使用路径来访问方法。
要获得您正在寻找的行为,您可以设置route_base:
class MyView(BaseView):
route_base = "/" #This will set the blueprint route
default_view = "method1"
...
# This returns Not Found because the url to MyView is now NOT /myview/
appbuilder.add_link("Method2", href="/myview/method2/jonh", category="My View")
# Since we overrode it, this now works
appbuilder.add_link("Method3", href="/method3/jonh", category="My View")