美文网首页Web开发——Flask框架
Flask框架——重定向(redirect)、url_for

Flask框架——重定向(redirect)、url_for

作者: 白巧克力LIN | 来源:发表于2021-11-25 15:53 被阅读0次

    在上篇文章中,我们学习了Flask框架——response响应对象及request对象,这篇文章我们来学习Flask框架——重定向、url_for。

    重定向(redirect)

    重定向(Redirect)就是通过各种方法将各种网络请求重新定个方向转到其它位置(如:网页重定向、域名的重定向、路由选择的变化也是对数据报文经由路径的一种重定向)。

    其流程如下图所示:


    首先客户端发送网络请求给服务端,服务端接收到请求后返回了状态码为302、新的location给客户端,客户端发现返回的状态码为302,就自动发送新的location中url网络请求给服务端,服务端就根据请求内容返回响应内容。

    网页需要重定向情况:

    • 网站调整(如改变网页目录结构);
    • 网页被移到一个新地址;
    • 网页扩展名改变(如应用需要把.php改成.Html或.shtml)。

    这种情况下,如果不做重定向,则用户收藏夹或搜索引擎数据库中旧地址只能让访问客户得到一个404页面错误信息,访问流量白白丧失;再者某些注册了多个域名的网站,也需要通过重定向让访问这些域名的用户自动跳转到主站点等。

    在Flask框架中提供了redirect()重定向方法,其语法格式如下:

    redirect(location,code=302,Response=None)
    

    其中:

    • location:响应应重定向到的位置;
    • code:响应码,支持的响应码为301、302、303、305、307和308,默认响应码为302;
    • Response:实例化响应时要使用的响应类。

    示例代码如下所示:

    from flask import Flask, redirect
    
    app=Flask(__name__)
    
    #路由装饰器
    @app.route('/index')
    def index():
        return "<a href='/register'>首页</a>"
    
    @app.route('/register')
    def register():
        return "<a href='/redirect'>跳转重定向页面redirect</a>"
    
    @app.route('/redirect')
    def get_redirect():
        return redirect('/index',code=302,Response=None)
    
    if __name__ == '__main__':
        app.run(port=8080,debug=True)
    

    这里我们使用了三次路由装饰器与视图函数并绑定URL链接,其URL分别为:

    http://127.0.0.1:8080/index
    http://127.0.0.1:8080/register
    http://127.0.0.1:8080/redirect
    

    首先我们进入第一个URL链接时并点击首页超链接就会跳转到第二个URL链接页面,跳转页面后,点击跳转重定向页面的超链接就会跳转到第一个URL链接页面,而在浏览器那一栏的URL链接为:http://127.0.0.1:8080/index

    那么问题来了,按道理应该是http://127.0.0.1:8080/redirect,,为什么会是:http://127.0.0.1:8080/index这个链接呢。这是因为我们通过redirect()方法重定向到第一个URL链接了。

    按照上面的步骤依次打开URL链接并点击页面中的超链接,打开开发者工具,如下图所示:


    我们发现在redirect中的状态码为302,点击redirect,如下图所示:

    当客户端发送http://127.0.0.1:8080/register的网络请求时,服务端返回响应的响应码为302,客户端发现响应码为302,就找到location中的URL,请发送该URL的网络请求,所以我们在图中可以看到有两个index响应。

    url_for

    在实际开发中,路由装饰器和视图函数绑定的URL链接可能会很长很长,那么我们可以在路由装饰器@app.route()中添加endpoint参数,该参数作用是为视图函数起别名,语法结构如下所示

    @app.route('/',endpoint='视图函数的别名')
    

    为视图函数起别名,那么怎么使用该别名呢?这时我们可以使用url_for()方法,语法结构为:

    url_for('视图函数名或视图函数别名')
    

    示例代码如下所示:

    from flask import Flask, redirect, url_for
    
    app=Flask(__name__)
    
    @app.route('/indexsdafsfsalkdhasfkljsdalf',endpoint='shouye')       #添加endpoint参数为视图函数其别名
    def index():
        return "<a href='/redirect'>首页</a>"
    
    @app.route('/redirect')                 
    def get_redirect():
        return redirect(url_for('shouye'),code=302,Response=None)   
    if __name__ == '__main__':
        app.run(port=8080,debug=True)
    

    首先我们为第一个视图函数添加了endpoint参数的值,该值就是视图函数的另一个名字,这样我们就可以通过url_for()方法并传入endpoint参数的值,就可以指向返回第一个视图函数的URL链接页面。

    除了在Flask程序中使用url_for()方法,我们还可以在HTML模板文件中使用url_for()方法,HTML模板文件示例代码如下所示:

    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <title>Title</title>
    </head>
    <body>
        <form action="{{ url_for('use_urlfor') }}" method="get">
            <input type="submit" value="提交">
        </form>
    </body>
    </html>
    

    这里我们在HTML模板中使用了url_for()方法并传入了视图函数名,当然也可以传入视图函数的别名。

    注意:在HTML模板文件中使用url_for()方式时,需要将该方法用双花括号围住。

    Flask程序示例代码如下所示:

    from flask import Flask, render_template
    
    app = Flask(__name__)
    
    @app.route('/')
    def hello_world():
        return  render_template('index.html')       #渲染index.html模板文件
    
    @app.route('/use_urlfor',endpoint='index')
    def use_urlfor():
        return '在模板文件中使用url_for'            #返回字符串
    
    if __name__ == '__main__':
        app.run()
    

    运行Flask程序,访问http://127.0.0.1:5000/并点击提交就会跳转页面,跳转的页面显示内容为:在模板文件中使用url_for。

    好了,有关Flask框架——重定向、url_for的知识就讲到这里了,感谢观看!!!下篇文章学习Flask框架——模板变量、控制块、过滤器!!!
    公众号:白巧克力LIN

    相关文章

      网友评论

        本文标题:Flask框架——重定向(redirect)、url_for

        本文链接:https://www.haomeiwen.com/subject/cpzatrtx.html