<p>烧瓶里的规矩是独一无二的。如果将绝对相同的URL定义给同一个函数,则默认情况下会发生冲突,因为从我们的角度来看,您所做的事情是错误的,因此我们会阻止您这样做。</p>
<p>有一个原因是,您希望有多个URL指向绝对相同的端点,这是与过去存在的规则向后兼容。由于WZ0.8和Flask 0.8,您可以显式指定路由的别名:</p>
<pre><code>@app.route('/')
@app.route('/index.html', alias=True)
def index():
return ...
</code></pre>
<p>在这种情况下,如果用户请求<code>/index.html</code>,Flask将自动发出永久重定向到<code>/</code>。</p>
<p>但这并不意味着函数不能绑定到多个url,但在这种情况下,您需要更改端点:</p>
<pre><code>@app.route('/')
def index():
...
app.add_url_rule('/index.html', view_func=index, endpoint='alt_index')
</code></pre>
<p>或者:</p>
<pre><code>@app.route('/')
@app.route('/index.html', endpoint='alt_index')
def index():
...
</code></pre>
<p>在这种情况下,您可以用另一个名称再次定义视图。但是,这通常是您希望避免的,因为视图函数必须检查request.endpoint才能查看调用的内容。不如这样做:</p>
<pre><code>@app.route('/')
def index():
return _index(alt=False)
@app.route('/index.html')
def alt_index():
return _index(alt=True)
def _index(alt):
...
</code></pre>
<p>在这两种情况下,URL生成都是<code>url_for('index')</code>或<code>url_for('alt_index')</code>。</p>
<p>也可以在路由系统级别执行此操作:</p>
<pre><code>@app.route('/', defaults={'alt': False})
@app.route('/index.html', defaults={'alt': True})
def index(alt):
...
</code></pre>
<p>在这种情况下,url生成是<code>url_for('index', alt=True)</code>或<code>url_for('index', alt=False)</code>。</p>