我在python Flask中有一个REST API,应该将字符串发布到先前定义的回调URL作为响应。这是我的代码:
return redirect(
location=callback_url,
code=200,
Response=Response(status=200, response="Zeinab,Abbasimazar,1989,Sep,07")
)
但是我在控制台中遇到以下错误:
[2019-12-25 18:15:07,482] ERROR in app: Exception on /v1/PaymentPage [POST]
Traceback (most recent call last):
File "/home/zeinab/.local/lib/python3.6/site-packages/flask/app.py", line 2446, in wsgi_app
response = self.full_dispatch_request()
File "/home/zeinab/.local/lib/python3.6/site-packages/flask/app.py", line 1951, in full_dispatch_request
rv = self.handle_user_exception(e)
File "/home/zeinab/.local/lib/python3.6/site-packages/flask/app.py", line 1820, in handle_user_exception
reraise(exc_type, exc_value, tb)
File "/home/zeinab/.local/lib/python3.6/site-packages/flask/_compat.py", line 39, in reraise
raise value
File "/home/zeinab/.local/lib/python3.6/site-packages/flask/app.py", line 1949, in full_dispatch_request
rv = self.dispatch_request()
File "/home/zeinab/.local/lib/python3.6/site-packages/flask/app.py", line 1935, in dispatch_request
return self.view_functions[rule.endpoint](**req.view_args)
File "/home/zeinab/PycharmProjects/paygate_service_rest/server.py", line 323, in payment_page
Response=Response(status=200, response=transaction.get_transaction_result_string(res_code=0))
File "/home/zeinab/.local/lib/python3.6/site-packages/werkzeug/utils.py", line 506, in redirect
mimetype="text/html",
TypeError: __call__() got an unexpected keyword argument 'mimetype'
在我跟踪代码时,这是在方法python3.6/site-packages/werkzeug/utils.py
的文件redirect
中的库中设置的:
response = Response(
'<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 3.2 Final//EN">\n'
"<title>Redirecting...</title>\n"
"<h1>Redirecting...</h1>\n"
"<p>You should be redirected automatically to target URL: "
'<a href="%s">%s</a>. If not click the link.'
% (escape(location), display_location),
code,
mimetype="text/html",
)
我已将代码更改为:
return redirect(
location=callback_url,
code=200,
Response="Zeinab,Abbasimazar,1989,Sep,07"
)
现在我得到了:
[2019-12-25 18:26:01,109] ERROR in app: Exception on /v1/PaymentPage [POST]
Traceback (most recent call last):
File "/home/zeinab/.local/lib/python3.6/site-packages/flask/app.py", line 2446, in wsgi_app
response = self.full_dispatch_request()
File "/home/zeinab/.local/lib/python3.6/site-packages/flask/app.py", line 1951, in full_dispatch_request
rv = self.handle_user_exception(e)
File "/home/zeinab/.local/lib/python3.6/site-packages/flask/app.py", line 1820, in handle_user_exception
reraise(exc_type, exc_value, tb)
File "/home/zeinab/.local/lib/python3.6/site-packages/flask/_compat.py", line 39, in reraise
raise value
File "/home/zeinab/.local/lib/python3.6/site-packages/flask/app.py", line 1949, in full_dispatch_request
rv = self.dispatch_request()
File "/home/zeinab/.local/lib/python3.6/site-packages/flask/app.py", line 1935, in dispatch_request
return self.view_functions[rule.endpoint](**req.view_args)
File "/home/zeinab/PycharmProjects/paygate_service_rest/server.py", line 324, in payment_page
Response=msg
File "/home/zeinab/.local/lib/python3.6/site-packages/werkzeug/utils.py", line 506, in redirect
mimetype="text/html",
TypeError: 'str' object is not callable
如何跳过mimetype
标头或进行更改?我的图书馆需要升级吗?
答案 0 :(得分:0)
return redirect(
location=callback_url,
code=200,
Response=Response(status=200, response="Zeinab,Abbasimazar,1989,Sep,07")
)
flask.redirect()
的{{3}}是301、302、303、305、307和308。所有HTTP重定向均以3xx开头。我不确定特定异常的确切原因,但这很可能是原因。如果我不得不猜测的话,Flask不会在重定向请求中出现模仿类型,因为HTTP重定向(至少是Flask支持的重定向)没有主体,只有标头。尝试将代码更新为此:
return redirect(location=callback_url, code=302)
HTTP状态为200告诉浏览器请求已成功完成,并且应呈现正文中返回的内容。某些响应(例如4xx响应)也可以具有主体,因为尽管发生了错误,服务器仍可能能够返回HTML以供浏览器呈现(例如自定义404页面)。但是,大多数3xx代码 不允许具有主体,而应该具有Location
标头,浏览器将在收到请求后导航至该标头。体内的内容将被忽略。可以在only supported status codes中找到HTTP状态代码的有用列表。
关于问题的后半部分,当第二次更改代码时,您将Response
参数替换为以下内容:
Response="Zeinab,Abbasimazar,1989,Sep,07"
您本来是正确的(不输入响应代码); flask.redirect
方法正在为Response
参数寻找类型为Response
的对象(我知道这很令人困惑),但是您传入的是str
类型的对象。
希望这会有所帮助。
TLDR:将code
方法的redirect
参数更改为支持的重定向状态代码之一,并且不要尝试返回响应正文。