20181011:理解url_for、redirect和render是如何配合完成页面跳转的?他们的区别是什么?

理解url_for、redirect 和 render是如何配合完成页面跳转的在这里插入图片描述

我们用上面的例子来分析删除一条记录的处理过程,程序流程大致是:

  • 客户在页面某条记录点击 “删除”按钮,这个按钮实质是一个包含了id参数的url链接。(比如/tag/del/3,其中3是id参数)
  • 收到访问页面请求,程序直接到tag_del函数块,在该函数中处理相关工作(比如从数据库中删除id=3的数据)
  • 完成处理后,根据逻辑就是重新显示记录列表,因此用url_for 拼接出访问记录列表页面的url(如:/tag/list/1,参考:图片中第一步的说明)
  • 有了url后,redirect重定向到url(这个操作类似用户主动在浏览器中输入该url访问页面,参考第二步说明)
  • 之后,就如客户主动访问页面类似,系统render_template渲染出页面展现给了用户。(参看第三、第四步说明)

附:url_for 、redirect、render 区别

  • url_for的作用:就是拼接出字符串类型的url。如 url_for() 函数最简单的用法是以视图函数名作为参数, 返回这个视图函数对应的头顶上@语法糖中的URL。url_for除了上面例子中说的拼接外,还可以拼接静态文件,请参考下面附加说明。
  • redirect 是重定向函数:这个函数的原型是def redirect(location, code=302, Response=None),其中location参数就是要重定向到的url,这个参数可以是直接的提供www.baid.com这样的,也可以url_for(XXXX)从拼接而来的,调用这个函数,就类似用户主动在浏览器中输入该url访问页面。例如 调用return redirect('https://www.baidu.com') 后,用户最终看到的就是页面跳转到了百度。
  • render渲染模板函数:这个函数是实实在在渲染模板,呈现给最终的用户。

简单说,就是:

  • url_for 拼接出网页的网址url,类似于拼接字符串
  • redirect 指示浏览器访问网址,类似用户地址栏输入具体地址访问网页
  • render 渲染出网页,类似用户输入了地址,按了回车后,浏览器展现出网页页面

附:url_for 是按什么规则拼接网页地址Url的?

url_for原型:def url_for(endpoint, **values)
1、反转url:一般我们通过一个URL就可以执行到某一个函数(@route路由)。如果反过来,我们知道一个函数,怎么去获得这个URL呢?url_for函数就可以帮我们实现这个功能。url_for()函数接收两个及以上的参数,他接收函数名作为第一个参数,第二个参数则接收对应URL里面参数(下面例子中page就是参数),如果还出现其他的参数,则会添加到URL的后面作为查询参数(类似这样:http://localhost:5000/admin/tag/list/1?abc),按这样的规则返回对应的URL。简单的讲就是,就是url_for会自动在视图模板中寻找和自己第一个参数endpoint一样函数,然后函数头顶@route中的url。 如果没有找到,就看下面第二点。
如下面的例子:因为有函数名tag_list和第一个参数一样,所以返回结果就是http://localhost:5000/admin/tag/list/1。当然,前面的http://localhost:5000/admin这一截是蓝图控制的。
在这里插入图片描述
2、直接字符串拼接:如果url_for没有找到和自己第一个参数一样名称的函数,则直接把第一个参数按普通字符串一样和后面的参数拼接。如下面的静态文件就是直接字符串模式拼接的,调用 url_for(‘static’,filename=‘base/image/logo.png’) ,得到的url是:http://localhost:5000/static/base/image/logo.png
在这里插入图片描述
web程序不仅由python代码和模板组成,还包括静态文件 ,例如:代码中引用的图片,javaScripts代码,CSS等
对静态文件static目录的引用,是被当做特殊的路由处理的 ,因为,默认情况下,flask在程序根目录下名为static的子目录下寻找静态文件,

为什么需要url_for

  1. 将来如果修改了URL,但没有修改该URL对应的函数名,就不用到处去替换URL了。
  2. url_for会自动的处理那些特殊的字符,不需要手动去处理。
    url = url_for('login',next='/')
    # 会自动的将/编码,不需要手动去处理。
    # url=/login/?next=%2F
    

强烈建议以后在使用url的时候,使用url_for来反转url。

  • 3
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
您的代码已经是一个良好的起点,但有一些可以进行优化的地方。下面是对您提供的代码进行优化的建议: 1. 使用密码哈希:在数据库中存储密码的哈希值而不是明文密码,可以提高安全性。 2. 使用表单验证:在服务器端进行用户名和密码的验证,而不是直接执行SQL查询。 3. 使用`flash`消息:使用`flash`消息来向用户显示错误信息,而不是将错误信息作为参数传递给模板。 4. 重命名路由:将路由函数的名称更改为更具描述性和一致性的名称。 下面是优化后的代码示例: ```python from flask import Flask, render_template, request, redirect, url_for, session, flash from werkzeug.security import check_password_hash app = Flask(__name__) app.secret_key = 'your_secret_key' @app.route('/') def home(): if 'username' not in session: return redirect(url_for('login')) else: return redirect(url_for('index')) @app.route('/index') def index(): return render_template('index.html') @app.route('/login', methods=['GET', 'POST']) def login(): if request.method == 'POST': username = request.form.get('username') password = request.form.get('password') # 查询数据库检查用户名和密码是否匹配 query = "SELECT * FROM users WHERE username=%s" values = (username,) cursor.execute(query, values) user = cursor.fetchone() if user and check_password_hash(user['password'], password): session['username'] = user['username'] flash('登录成功', 'success') return redirect(url_for('index')) else: flash('用户名或密码错误', 'error') return redirect(url_for('login')) else: return render_template('login.html') if __name__ == '__main__': app.run() ``` 注意,上述代码假设您已经在数据库中存储了用户的密码哈希值,并且已经配置了数据库连接。请根据您的实际情况进行相应的修改。此外,还需要根据您的实际需求来调整`index.html`和`login.html`模板文件。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值