我正在尝试实现重定向模式,类似于StackOverflow所做的事情:
@route('/<int:id>/<username>/')
@route('/<int:id>/')
def profile(id, username=None):
user = User.query.get_or_404(id)
if user.clean_username != username:
return redirect(url_for('profile', id=id, username=user.clean_username))
return render_template('user/profile.html', user=user)
这是应该发生的情况的简单表格:
URL Redirects/points to
====================================================
/user/123 /user/123/clean_username
/user/123/ /user/123/clean_username
/user/123/foo /user/123/clean_username
/user/123/clean_username /user/123/clean_username
/user/123/clean_username/ /user/123/clean_username/
/user/125698 404
现在,我可以使用访问配置文件/user/1/foo
,但/user/1
会生成一个BuildError
。我已经尝试使用alias=True
关键字参数和一些东西defaults
,但是我不确定什么是行不通的。
我如何将一条路由这样重定向到另一条路由?
更新:解决主要问题“我的路线出了什么问题”,最简单的调试方法是使用app.url_map
;例如:
>>> app.url_map
Map([<Rule '/user/<id>/<username>/' (HEAD, OPTIONS, GET) -> profile>,
<Rule '/static/<filename>' (HEAD, OPTIONS, GET) -> static>,
<Rule '/user/<id>/' (HEAD, OPTIONS, GET) -> profile>])
在这种情况下,这确认端点设置正确。这是同时展示Plain flask
和的示例flask-classy
:
from app import app, models
from flask import g, redirect, url_for, render_template, request
from flask.ext.classy import FlaskView, route
@app.route('/user/<int:id>', strict_slashes=False)
@app.route('/user/<int:id>/<username>', strict_slashes=False)
def profile(id, username=None):
user = models.User.query.get_or_404(id)
if user.clean_username != username:
return redirect(url_for('profile', id=id, username=user.clean_username))
return render_template('profile.html', user=user)
class ClassyUsersView(FlaskView):
@route('/<int:id>', strict_slashes=False)
@route('/<int:id>/<username>', strict_slashes=False, endpoint='classy_profile')
def profile(self, id, username=None):
user = models.User.query.get_or_404(id)
if user.clean_username != username:
return redirect(url_for('classy_profile', id=id, username=user.clean_username))
return render_template('profile.html', user=user)
ClassyUsersView.register(app)
它们具有不同的端点,你需要考虑以下因素url_for:
>>> app.url_map
Map([<Rule '/classyusers/<id>/<username>' (HEAD, OPTIONS, GET) -> classy_profile>,
<Rule '/user/<id>/<username>' (HEAD, OPTIONS, GET) -> profile>,
<Rule '/classyusers/<id>' (HEAD, OPTIONS, GET) -> ClassyUsersView:profile_1>,
<Rule '/static/<filename>' (HEAD, OPTIONS, GET) -> static>,
<Rule '/user/<id>' (HEAD, OPTIONS, GET) -> profile>])
没有flask-classy
端点名称的是函数名称,但是如你所知,使用时这是不同的classy
,你可以使用来查看端点名称,url_map()
或使用来在端点名称中分配它@route(..., endpoint='name')
。
减少重定向:
要在最小化重定向数量的情况下响应你发布的url,你需要使用strict_slashes=False
,这将确保处理未以终止的请求,/
而不是通过重定向将其301
重定向到以其/
终止的副本:
@app.route('/user/<int:id>', strict_slashes=False)
@app.route('/user/<int:id>/<username>', strict_slashes=False)
def profile(id, username=None):
user = models.User.query.get_or_404(id)
if user.clean_username != username:
return redirect(url_for('profile', id=id, username=user.clean_username))
return render_template('profile.html', user=user)
结果如下:
>>> client = app.test_client()
>>> def check(url):
... r = client.get(url)
... return r.status, r.headers.get('location')
...
>>> check('/user/123')
('302 FOUND', 'http://localhost/user/123/johndoe')
>>> check('/user/123/')
('302 FOUND', 'http://localhost/user/123/johndoe')
>>> check('/user/123/foo')
('302 FOUND', 'http://localhost/user/123/johndoe')
>>> check('/user/123/johndoe')
('200 OK', None)
>>> check('/user/123/johndoe/')
('200 OK', None)
>>> check('/user/125698')
('404 NOT FOUND', None)
行为strict_slashes:
with strict_slashes=False
URL Redirects/points to # of redirects
===========================================================================
/user/123 302 /user/123/clean_username 1
/user/123/ 302 /user/123/clean_username 1
/user/123/foo 302 /user/123/clean_username 1
/user/123/foo/ 302 /user/123/clean_username 1
/user/123/clean_username 302 /user/123/clean_username 1
/user/123/clean_username/ 200 /user/123/clean_username/ 0
/user/125698 404
with strict_slashes=True (the default)
any non '/'-terminated urls redirect to their '/'-terminated counterpart
URL Redirects/points to # of redirects
===========================================================================
/user/123 301 /user/123/ 2
/user/123/foo 301 /user/123/foo/ 2
/user/123/clean_username 301 /user/123/clean_username/ 1
/user/123/ 302 /user/123/clean_username/ 1
/user/123/foo/ 302 /user/123/clean_username/ 1
/user/123/clean_username/ 200 /user/123/clean_username/ 0
/user/125698 404
example:
"/user/123/foo" not terminated with '/' -> redirects to "/user/123/foo/"
"/user/123/foo/" -> redirects to "/user/123/clean_username/"
我相信它完全可以满足你的测试矩阵的要求:)
问题内容: 我正在编写一个小的AngularJS应用,该应用具有登录视图和主视图,其配置如下: 我的LoginController检查用户/密码组合,并在$ rootScope上设置一个属性,以反映此情况: 一切正常,但是如果我访问,最终将绕过登录屏幕。我想写一些类似的内容,“每当路由更改时,如果$ rootScope.loggedUser为null,则重定向到/ login” … …等等。我可以
问题内容: 我有一个名为Item的数据库表。项目具有一个属性,可以是以下任一属性 在我的网站上,我有两个显示Item表的视图。 视图1显示 所有 项目(带有状态列)。 视图2 仅 显示状态为的项目。 根据项目状态,用户可以执行某些操作(“要做的事”,“要做的事”,“要做的事”)。 如果您考虑视图1和视图2,它们的共同点是它们包含状态为的项目。所以在两者上我都有一个Button链接到一个名为 id-
我使用Laravel 5.4的项目和场景是,如果没有任何创建然后在登录重定向到页面。 下面是我的路线页编码 目录结构是 下面是我的code 它重定向了太多次,我收到错误消息说。 我在这里做错了什么??
Flask类有重定向函数。调用时,它会返回一个响应对象,并将用户重定向到具有指定状态码的另一个目标位置。 函数的原型如下 - 在上述函数中 - location 参数是响应应该被重定向的URL。 statuscode 参数发送到浏览器的头标,默认为。 response 参数用于实例化响应。 以下状态代码是标准化的 - HTTP_300_MULTIPLE_CHOICES HTTP_301_MOVED
英文原文:http://emberjs.com/guides/routing/redirection/ 过渡与重定向 在路由中调用transitionTo或者在控制器中调用transitionToRoute,将停止当前正在进行的过渡,并开启一个新的,这也用作重定向。transitionTo具有参数,其行为与link-to助手相同。 如果过渡到一个没有动态段的路由,路由的model钩子始终都会运行。