【问题标题】:Get unexpected keyword argument 'mimetype' when calling redirect in Flask在 Flask 中调用重定向时获取意外的关键字参数“mimetype”
【发布时间】:2019-12-25 14:57:06
【问题描述】:

我在 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'

当我跟踪代码时,这是在方法 redirect 中文件 python3.6/site-packages/werkzeug/utils.py 的库中设置的:

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 标头或更改它?我的库需要升级吗?

【问题讨论】:

    标签: python flask http-headers


    【解决方案1】:
    return redirect(
        location=callback_url,
        code=200,
        Response=Response(status=200, response="Zeinab,Abbasimazar,1989,Sep,07")
    )
    

    flask.redirect()only supported status codes 是 301、302、303、305、307 和 308。所有 HTTP 重定向都以 3xx 开头。我不确定特定异常的确切原因,但这很可能是原因。如果我不得不猜测,Flask 并不期望重定向请求中有 mimetype,因为 HTTP 重定向(至少,Flask 支持的重定向)没有正文,只有标头。尝试将您的代码更新为:

    return redirect(location=callback_url, code=302)
    

    HTTP 状态 200 告诉浏览器请求成功,并且它应该呈现在正文中返回的内容。一些响应,例如 4xx 响应,也可以有正文,因为尽管发生了错误,服务器仍然可以返回 HTML 供浏览器呈现(例如自定义 404 页面)。但是,大多数 3xx 代码不允许有正文,而是应该有一个 Location 标头,浏览器将在收到请求时导航到该标头。正文中的内容将被忽略。可以在here 找到有用的 HTTP 状态代码列表。

    关于您问题的后半部分,当您第二次更改代码时,您将 Response 参数替换为以下内容:

    Response="Zeinab,Abbasimazar,1989,Sep,07"
    

    您最初的内容是正确的(将响应代码排除在外); flask.redirect 方法正在为 Response 参数寻找 Response 类型的对象(我知道这很令人困惑),但您传入的是 str 类型的对象。

    希望这会有所帮助。


    TLDR:将redirect 方法的code 参数更改为受支持的重定向状态代码之一,并且不要尝试返回响应正文。

    【讨论】:

      猜你喜欢
      • 2020-02-26
      • 2015-04-29
      • 2017-10-03
      • 2020-02-27
      • 2017-08-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多