为了账号安全,请及时绑定邮箱和手机立即绑定

flask中到url重定向报错,却参数,但不知道这个参数到底应该是怎么传送的

/ 猿问

flask中到url重定向报错,却参数,但不知道这个参数到底应该是怎么传送的

胖猫CAT 2019-11-27 11:04:33
from flask import Flask, url_for
from werkzeug.utils import redirect

app = Flask(__name__)
@app.route('/admin')
def hello_admin():
   return 'Hello Admin'

@app.route('/guest/')
def hello_guest(guest):
   return 'Hello %s as Guest' % guest

@app.route('/user/')
def hello_user(name):
   if name =='admin':
      return redirect(url_for('hello_admin'))
   else:
      return redirect(url_for('hello_guest'), guest = name)
    
if __name__ == '__main__':
   app.run(debug=True)

1、运行  显示 Hello Admin 运行正常

2、但是运行   
显示如下错误:TypeErrorTypeError: hello_user() missing 1 required positional argument: 'name'

3、再次运行http://127.0.0.1:5000/user/admin
显示如下错误:Not FoundThe requested URL was not found on the server. If you entered the URL manually please check your spelling and try again.

4、再次运行
显示如下错误:Not FoundThe requested URL was not found on the server. If you entered the URL manually please check your spelling and try again.

第3、4次运行中是不是我的输入是错误导致的?那么参数应该怎么传呢?

5、因为以上代码是教程中到源代码,应该是没有错的。
后来我修改了源代码中@app.route('/user/<name>')加入了<name>这个参数。
运行  和  都显示Hello Admin 运行正常。
但是运行http://127.0.0.1:5000/user/kjkj
显示如下错误:TypeErrorTypeError: redirect() got an unexpected keyword argument 'guest'
请问问题到底出在哪里呢??


查看完整描述

1 回答

?
pardon110

报错信息已经明确告诉你redirect方法并不期望得到一个命名关键字参数guest

查官网看函数redirect签名如下,参阅 https://werkzeug.palletsprojects.com/en/0.16.x/utils/?highlight=redirect#werkzeug.utils.redirect

werkzeug.utils.redirect(locationcode=302Response=None)


理解语句 

@app.route(
'/user/<name>'
)
def hello_user(name):
...

<name> 是一个路径参数,类似于正则中的子模式命名捕获。简单来讲,会将<name>位置的字符串给予给一个命名变量name, 该命名变量即是app.route装饰器所装饰路由处理器函数的实参,也是其隐性的关键字形参,所以一旦将hello_user形参改为其它非name名的变量参数,也会报错。

而url_for 签名是这样

flask.url_for(endpoint**values)


所以如的确想传参数可以这样操作,

修改hello_guest装饰器参数变更hello_user的中的url_for方法参数布局

代码如下所示

@app.route('/guest/<guest>')
def hello_guest(guest):
   return 'Hello %s as Guest' % guest
    
@app.route('/user/<name>')
def hello_user(name):
   if name == 'admin':
      return redirect(url_for('hello_admin'))
   else:
      return redirect(url_for('hello_guest',guest=name))

访问 http://localhost:5000/user/admin  重定向显示 hello admin

访问 http://localhost:5000/user/kjkj  则重定向显示  Hello kjkj as Guest

出错原因结论:

你给了redirect不该有的参数,却没有向hello_guest(guest)路由逻辑处理器传递它想要的路径参数<guest>(通过app.route装饰器传递)。本质上对装饰器路由,关键字参数,及相关的框架函数不理解。

查看完整回答
反对 回复 2019-11-29

添加回答

回复

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信