Как исправить «TypeError: объект dict не вызывается» в запросах - PullRequest
0 голосов
/ 31 января 2019

Моя цель для этого кода - отправить письмо с помощью Mailgun.Я использую вызов из Flask с использованием библиотеки requests:

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 голосов
/ 31 января 2019

Вы неправильно используете аргумент api.Вы хотите передать комбинацию имени пользователя и пароля в виде кортежа :

auth=("api", API_KEY),

API Mailgun действительно требует, чтобы вы передавали ключ API в качестве пароля базовой аутентификации , но для отправки заголовка Basic Authentication с использованием аргумента ключевого слова auth необходимо либо передать экземпляр HTTPBasicAuth(), либо кортеж :

Выполнение запросов с помощью HTTP BasicAuth очень прост:

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

На самом деле, HTTP Basic Auth настолько распространен, что Requests предоставляет удобное сокращение для его использования:

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

Предоставление учетных данных в кортеже, подобном этомуточно такой же, как пример HTTPBasicAuth выше.

...