重定向会上一个页面

在某些场景下,我们需要在用户访问某个url后重定向会上一个页面,比如用户点击某个需要登录才能访问的连接,这时程序会重定向到登录页面,当用户登录后比较合理的行为是重定向到用户登录前浏览的页面。

下面的例中,在foo和bar视图中生成连接,链接过去后,没有重定向会上一个页面

@app.route('/foo')
def foo():
    return '<h1>Foo page </h1><a href="%s">Do something</a>' %url_for('do_something') @app.route('/bar')
def bar():
    return '<h1>Bar page</h1><a href="%s">Do something </a>' % url_for('do_something') @app.route('/do_something')
def do_something():
    return redirect(url_for('hello')) @app.route('/hello')
def hello():
    name = request.args.get('name')
    if name is None:
        name = request.cookies.get('name','xiaxiaoxu')#从cookie中获取name值
       
response = '<h1>Hello, %s</h1>' % name
    return response if __name__ == '__main__':
    app.run(debug = True)

结果:

访问127.0.0.1:5000/foo或者127.0.0.1:5000/bar后,页面出现连接,点击链接后,进入hello页面,之后停留在了hello页面

点击链接后重定向到了hello页面

我们的目的是在链接后,返回原来的页面

重定向会上一个页面,关键是获取上一个页面的URL。

获取上一个页面的URL有两种方法:

HTTP referrer

HTTP referrer是一个用来记录请求发源地址的HTTP首部字段(HTTP_REFERER),即访问来源。当用户在某个站点点击链接,浏览器想新链接所在的服务器发起请求,请求的数据中包含的HTTP_REFERER字段记录了用户所在的原站点URL。

在flask中,referer的值可以通过请求对象的referrer属性获取,即request.referrer

修改do_something视图函数:

@app.route('/do_something')
def do_something():
    return redirect(request.referrer)

在bar页面上再次点击链接

有的时候,referrer字段可能是空值,比如用户直接在浏览器地址栏输入URL或者因为防火墙或者浏览器设置自动清除或修改referer字段,我们需要添加一个备选项:

return redirect(request.referrer or url_for('hello'))

查询参数next

除了自动从referrer获取,另一种更常见的方式是在URL中手动加入包含当前页面URL的查询参数,这个查询参数一般命名为next

在bar视图中的链接do_something对应的视图添加next参数(在/do_someghing后加参数)

def bar():
    #print dir(request)
   
print "request.full_path:",request.full_path
    #print "request.url:",request.url
   
return '<h1>Bar page</h1><a href="%s">Do something and redirect </a>' % url_for('do_something', next = request.full_path) @app.route('/do_something')
def do_something():
    return redirect(request.args.get('next'))

为了避免next参数为空的情况,也可以加备选项,如果为空就重定向到hello视图

return redirect(request.args.get('next', url_for('hello')))

为了覆盖更全面,可以将查询参数next和referrer两种方式结合起来使用:

先获取next参数,如果为空就尝试获取referer,如果仍然为空,就重定向到默认的hello视图

因为在不同视图执行这部分操作的代码相同,我们可以创建一个通用的函数redirect_back()函数

在do_something视图中调用这个函数

@app.route('/bar')
def bar():
    print "request.full_path:",request.full_path
    return '<h1>Bar page</h1><a href="%s">Do something and redirect </a>' % url_for('do_something', next = request.full_path) def redirect_back(default = 'hello',**kwargs):
    for target in request.args.get('next'),request.referrer:
        if target:
            return redirect(target)
    return redirect(url_for(default,**kwargs)) @app.route('/do_something_and_redirect')
def do_something():
    return redirect_back() if __name__ == '__main__':
    app.run(debug = True)

 

flask 重定向到上一个页面,referrer、next参数的更多相关文章

  1. laravel重定向到上一个页面怎么带参数返回 withsucess 成功提示信息

    //控制器中 return back()->with('success','操作成功'); //with的参数1是一个session变量名,参数2为该session变量值,在视图直接这样获取 @ ...

  2. h5 网络断网时,返回上一个页面 demo (与检测网络代码相结合,更直观看到结果)

    页面一: <!DOCTYPE html><html lang="en"><head> <meta charset="UTF-8& ...

  3. vue滚动行为控制——页面跳转返回上一个页面保留滚动位置

    需求分析: 一般这个功能在后台管理系统用的比较多,因为后台页面都是在当前页面打开,对于某些列表筛选页,如果列表数据比较多,页面就会滚动.当页面发生滚动,对列表数据进行查看或者编辑的时候,跳转到下一级页 ...

  4. Flutter - 添加从左向右滑动,返回上一个页面

    很多App比如微信.IT之家等都支持从屏幕左侧向右滑动,来返回上一个页面. 很多iOS上的App也都支持. 那么这个神奇的手势滑动是怎么实现的呢? 其实非常简单,只需要添加一句话即可. platfor ...

  5. 在小程序中修改上一个页面里data中的数据调用上一个页面的方法

    //获取已经打开的页面的数组 var pages = getCurrentPages(); //获取上一个页面的所有的方法和data中的数据  var lastpage = pages[pages.l ...

  6. 01_6_SERVLET如何从上一个页面取得参数

    01_6_SERVLET如何从上一个页面取得参数 1. sevlet实现 public void doGet(HttpServletRequest request, HttpServletRespon ...

  7. JavaScript中,返回上一个页面时,如何保证上一个页面的不刷新?

    history.back()和history.go(-1)都可以实现返回上一页并不刷新.History 对象包含用户(在浏览器窗口中)访问过的 URL. history.back() 等同于在浏览器点 ...

  8. 从上一个页面跳入新页面时,如何拿URL中的参数

    var url = document.URL; //获取当前页面的url var urlA = url.split('?');//以url中的问号进行分割; var goodscode = urlA[ ...

  9. 一百二十一:CMS系统之注册后跳转到上一个页面

    实现功能,访问测试页面的时候,跳转到注册页面,注册成功后跳转到测试页面 使用参数:若是从其他地址跳转过来时,头部信息中会携带参数referrer,此参数为从从哪个地址跳转到当前地址的,若是直接从浏览器 ...

随机推荐

  1. 兼容ie10及以上css3加载进度动画

      html <div class="spinner">   <div class="rect1"></div>   < ...

  2. Python3学习之路~6.8 多态

    多态性(polymorphisn)是允许你将父对象设置成为和一个或更多的他的子对象相等的技术,赋值之后,父对象就可以根据当前赋值给它的子对象的特性以不同的方式运作.简单的说,就是一句话:允许将子类类型 ...

  3. JS中函数表达式与函数声明的区别

    hello,沐晴又来更新啦,今天呢,跟大家讲讲让人头疼的函数表达式和函数声明,反正我当初看那本高级程序的时候,是没怎么看太透,哈哈.我是个比较重基础的人,跟我一起探讨函数表达式和函数声明的世界吧. 首 ...

  4. PHP 生成器入门

    https://juejin.im/entry/5b4c2d76f265da0f697029ad PHP 在 5.5 版本中引入了「生成器(Generator)」特性,不过这个特性并没有引起人们的注意 ...

  5. [django]django corepython核心编程

    model meta排序 class BlogPost(models.Model): title = models.CharField(max_length=150) body = models.Te ...

  6. 分词、词性标注POS等学习【转载】

    转自:https://cloud.tencent.com/developer/article/1091815 1. 分词(Word Cut) 英文:单词组成句子,单词之间由空格隔开 中文:字.词.句. ...

  7. 加载更多的ajax 字符串拼接

    https://www.cnblogs.com/52fhy/p/5405541.html

  8. leetcode的注意点

    读懂一个题其实非常非常重要,读懂题包括要读懂题的问题是什么,条件是什么,考察的是什么知识点.所以能够读懂题就已经成功一半了,但是如果没有读懂题目就开始答题,就不假思索地乱写答案,那么会事倍功半,还得返 ...

  9. Groovy动态解析

    A:前面需要说些什么吗? B:不需要吗? A:需要吗? 解析方式一:通过指定的paths来初始化GroovyScriptEngine //通过指定的paths来初始化GroovyScriptEngin ...

  10. css3--之backface-visibility

    使用CSS3 backface-visibility属性制作翻转动画效果:    http://www.htmleaf.com/ziliaoku/qianduanjiaocheng/201504151 ...