如何修复请求中的“ TypeError:'dict'对象不可调用”

时间:2019-01-31 12:40:08

标签: python python-3.x python-requests mailgun

此代码的目标是使用Mailgun发送电子邮件。我正在使用requests库从Flask调用它:

contact.py

def index():
  data = request.form.to_dict()
  send_email(data)
  return "Success!"

send_email()

def send_email(data: dict):
  data = format_data(data)

  return requests.post(
    API_URL,
    auth={ "api": API_KEY },
    data=data,
  )

我知道它与send_email()函数有关,但是我目前仍在解决该问题上。


编辑:这是完整的追溯:

Traceback (most recent call last):
  File "/usr/lib/python3/dist-packages/flask/app.py", line 1982, in wsgi_app
    response = self.full_dispatch_request()
  File "/usr/lib/python3/dist-packages/flask/app.py", line 1614, in full_dispatch_request
    rv = self.handle_user_exception(e)
  File "/usr/lib/python3/dist-packages/flask/app.py", line 1517, in handle_user_exception
    reraise(exc_type, exc_value, tb)
  File "/usr/lib/python3/dist-packages/flask/_compat.py", line 33, in reraise
    raise value
  File "/usr/lib/python3/dist-packages/flask/app.py", line 1612, in full_dispatch_request
    rv = self.dispatch_request()
  File "/usr/lib/python3/dist-packages/flask/app.py", line 1598, in dispatch_request
    return self.view_functions[rule.endpoint](**req.view_args)
  File "contact.py", line 9, in index
    send_email(data)
  File "/home/david-hermes/Desktop/Projects/frontend/web/single-page-resume/send_email.py", line 44, in send_email
    data=data,
  File "/usr/lib/python3/dist-packages/requests/api.py", line 112, in post
    return request('post', url, data=data, json=json, **kwargs)
  File "/usr/lib/python3/dist-packages/requests/api.py", line 58, in request
    return session.request(method=method, url=url, **kwargs)
  File "/usr/lib/python3/dist-packages/requests/sessions.py", line 494, in request
    prep = self.prepare_request(req)
  File "/usr/lib/python3/dist-packages/requests/sessions.py", line 437, in prepare_request
    hooks=merge_hooks(request.hooks, self.hooks),
  File "/usr/lib/python3/dist-packages/requests/models.py", line 309, in prepare
    self.prepare_auth(auth, url)
  File "/usr/lib/python3/dist-packages/requests/models.py", line 540, in prepare_auth
    r = auth(self)
TypeError: 'dict' object is not callable
127.0.0.1 - - [31/Jan/2019 21:01:28] "POST / HTTP/1.1" 500 -

1 个答案:

答案 0 :(得分:0)

您错误地使用了api参数。您想将用户名和密码组合作为元组传递

auth=("api", API_KEY),

Mailgun API确实是requires you to pass in the API key as a Basic Auth password,但是要使用auth关键字参数发送基本身份验证标头,则您可以传入HTTPBasicAuth() instance or a tuple

  

使用HTTP基本身份验证进行请求非常简单:

>>> from requests.auth import HTTPBasicAuth
>>> requests.get('https://api.github.com/user', auth=HTTPBasicAuth('user', 'pass'))
<Response [200]>
     

实际上,HTTP基本身份验证非常普遍,因此请求提供了使用它的便捷方式:

>>> requests.get('https://api.github.com/user', auth=('user', 'pass'))
<Response [200]>
     

在这样的元组中提供凭据与上面的HTTPBasicAuth示例完全相同。