2023.12.6 关于flask中的route、render_template、redirect的关系问题

2023-12-14 00:01:13

2023.12.6 关于flask中的route、render_template、redirect的关系问题

之前对于route、render_template、redirect三者的关系还有一些模糊,测试了一个案例后就比较清晰了,简单来说就是路径、模板和重定向,三者相对独立,只是一般命名的时候都用同样的名称,容易造成误解。

注意:不同路径下可以渲染同一个模板!

在 Flask 中,route、render_templateredirect 是用于构建 Web 应用程序的不同功能。
route 是一个装饰器,用于在 Flask 应用中定义路由。通过 route 装饰器,可以将 URL 和对应的处理函数绑定起来。例如,@app.route('/') 可以将根路径绑定到一个处理函数上。

render_template 是一个函数,用于在 Flask 应用中渲染模板文件。它接受一个模板文件的名称作为参数,并且可以传递一些数据给模板文件,以便在生成 HTML 响应时进行渲染。通常,在处理函数中使用 render_template 来生成动态的网页内容。

注意:可以在同一个路径下渲染不同的模板!

redirect 是一个函数,用于在 Flask 应用中执行重定向操作。它接受一个 URL 作为参数,并将用户请求重定向到该 URL 对应的页面。通常,您可以在处理函数中使用 redirect 来将用户重定向到其他页面,例如登录成功后跳转到主页。

注意:重定向定向到路径而不是模板!

简而言之,route 用于定义路由,将 URL 和处理函数绑定;render_template 用于渲染模板文件,生成动态的网页内容;而 redirect 用于执行重定向操作,将用户导航到其他页面。

下面有两种写法,程序齐全的时候运行,功能是一样的,但是细节会有区别。测试后可以有比较深的体会。

方法一

@bindex.route('/home')
def home():
    if 'username' in session:
        username = session['username']
        role = session['role']
        if role == 'admin':
            return render_template('home_admin.html', username=username)
        else:
            return render_template('home_user.html', username=username)
    else:
        return redirect(url_for('account.login'))

方法二:

@account.route('/home')
def home():
    if 'username' in session:
        username = session['username']
        role = session['role']
        if role == 'admin':
            return redirect(url_for('bindex.home_admin'))
        else:
            return redirect(url_for('bindex.home_user'))
    else:
        return redirect(url_for('account.login'))

方法一和方法二的区别在于:
(1)方法一的url仅会显示/home,而非/home_admin或者/home_user,相当于用/home遮盖住了/home_admin或者/home_user,方法二相反。
(2)两者均可以在/home_admin或者/home_user模板上再次进行get/post操作,实现效果相同。

综上,方法一可以隐藏后端可能存在的URL,在安全性上会略好于方法二;方法二更适合做比较复杂的多种权限管理系统,可以通过蓝图的形式将多种权限进行独立划分。方法一的优点是代码重复量少,但是耦合严重。可以视实际需求进行选择。

文章来源:https://blog.csdn.net/leigh_chen/article/details/134984193
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。