使用app.add_url_rule时是否需要为网址命名?

时间:2013-05-18 19:45:56

标签: python flask

来自Flask文档:

def index():
    pass
app.add_url_rule('/', 'index', index)

它还说:

  

endpoint - 已注册URL规则的端点。 Flask本身将视图函数的名称视为端点

事实上,如果我做app.add_url_rule('/', None, index)这一切似乎都很好。 (我不确定术语和“端点”究竟是什么。)

还有一些问题:

  1. 有没有理由指定第二个参数?

  2. 第二个参数确实是“终点”吗?

  3. (不)指定第二个参数有什么好处/缺点?

  4. 如果在其他网址规则中使用相同的名称,该怎么办?是第一次被覆盖?这是打算吗?

2 个答案:

答案 0 :(得分:2)

在这种情况下,端点只是应用程序有效URL的术语。来自维基百科:

  

在面向服务的体系结构中,端点是服务,进程或队列或主题目标的入口点

至于命名您的网址 - 是的,它是可选的。定义名称有一些好处。例如,当使用* url_for *()或重定向()时,您可以将网址名称指定为快捷方式。这样做的另一个好处是允许您更改网址结构而不更改与该网址交互的每一行代码,因为它只是按名称引用它。

因此,在您的示例中,您可以像这样引用您的索引网址:

return redirect('index')

对于你的上一个问题,我不确定会发生什么。尝试使用该名称解析URL时可能会出错。无论哪种方式,都没有理由定义两个具有相同名称的不同网址。

答案 1 :(得分:1)

第二个参数的原因如下:

假设您正在设计一个网站,并且/login是您的用户输入用户名,密码,OpenID等的页面。成功登录后,您可能希望将它们发送到/。在Flask中,规范的方法是:

return redirect(url_for('index'))

其中'index'是您定义为/的处理程序的函数的名称,例如,

@app.route('/')
def index():
    return render_template('index.html')

如果您改为:

def index():
    return render_template('index.html')

app.add_url_rule('/', None, index)

当您的用户明确请求/时,它会正常工作,但当您的用户成功登录时,他们将面临可怕的错误消息,并且必须手动访问/

简而言之,这是正确的事情。

另外,你应该注意到

@app.route('/')
def index():
    return render_template('index.html')

def index():
    return render_template('index.html')

app.add_url_rule('/', 'index', index)

完全相同,并且在最后两个片段中redirect(url_for('index'))都可以完美地运作。