#python #django #sendgrid
Вопрос:
У меня небольшая проблема с отправкой электронных писем через sendgrid
, когда я отправляю электронное письмо с активацией, я получаю сообщение об ошибке:
exception ("'int' object has no attribute 'get'",)
Я провел некоторую отладку, и создается электронное письмо с уникальным ключом активации.
Все необходимые поля(от, получатели, тема, html-адрес электронной почты) были заполнены
Я также создал новый api_key в sendgrid, и он имеет полный доступ.
Я был бы признателен за любую обратную связь, если вам нужна дополнительная информация, пожалуйста, дайте мне знать. ниже приведен код, который я использую:
View.py:
class AccountEmailActivateView(FormMixin, View): success_url = '/' form_class = ReactivateEmailForm key = None def get(self, request, key=None, *args, **kwargs): self.key = key if key is not None: qs = EmailActivation.objects.filter(key__iexact=key) confirm_qs = qs.confirmable() if confirm_qs.count() == 1: obj = confirm_qs.first() obj.activate() messages.success(request, "your email has been confirmed, please login.") return redirect("account:login") else: activated_qs = qs.filter(activated=True) if activated_qs.exists(): reset_link = reverse("password_reset") msg = """Your email has already been confirmed Do you need to lt;a href="{link}"gt;reset your password?lt;/agt; """.format(link=reset_link) messages.success(request, mark_safe(msg)) return redirect("account:login") context = { 'form': self.get_form(), 'key': key, } return render(request, 'registration/activation-error.html', context) def post(self, request, *args, **kwargs): form = self.get_form() if form.is_valid(): return self.form_valid(form) else: return self.form_invalid(form) def form_valid(self, form): msg = """Activation link sent, please check email""" messages.success(self.request, msg) email = form.cleaned_data.get("email") obj = EmailActivation.objects.email_exists(email).first() user = obj.user new_activation = EmailActivation.objects.create(user=user, email=email) new_activation.send_activation_email() return super(AccountEmailActivateView, self).form_valid(form) def form_invalid(self,form): request = self.request context = { 'form': form, 'key': self.key, } return render(request, 'registration/activation-error.html', context)
account/Models.py:
def send_activation_email(self): if not self.activated and not self.forced_expired: if self.key: base_url = getattr(settings, 'BASE_URL', None) print("base url", base_url) sg_api_key = getattr(settings, 'EMAIL_HOST_PASSWORD', None) key_path = reverse("account:email-activate", kwargs={'key': self.key}) path = "{base}{path}".format(base=base_url, path=key_path) context = { 'path': path, 'email': self.email, } txt_ = get_template("registration/emails/verify.txt").render(context) html_ = get_template("registration/emails/verify.html").render(context) subject = '1-Click Email Activation' from_email = settings.DEFAULT_FROM_EMAIL recipient_list = [self.email] sent_mail = send_mail( subject, txt_, from_email, recipient_list, html_message=html_, fail_silently=False, ) print(send_mail) try: api_key = os.environ.get('SENDGRID_API_KEY', None) sg = SendGridAPIClient(api_key) response = sg.send(sent_mail) print("status code: ",response.status_code) print("body", response.body) print("headers", response.headers) except Exception as e: print("exception", e.args) return False
Обновление 2021-11-24: Я добавил полную ошибку обратной трассировки (должен был добавить ее для начала действительно)
Request Method: POST Request URL: http://localhost:8000/account/email/resend-activation/ Django Version: 3.1.12 Python Version: 3.8.10 Installed Applications: ['django.contrib.admin', 'django.contrib.auth', 'django.contrib.contenttypes', 'django.contrib.sessions', 'django.contrib.sites', 'django.contrib.messages', 'django.contrib.staticfiles', 'storages', 'accounts', 'addresses', 'analytics', 'billing', 'blog', 'carts', 'marketing', 'orders', 'payment', 'products', 'search', 'tags'] Installed Middleware: ['django.middleware.security.SecurityMiddleware', 'django.contrib.sessions.middleware.SessionMiddleware', 'django.middleware.common.CommonMiddleware', 'django.middleware.csrf.CsrfViewMiddleware', 'django.contrib.auth.middleware.AuthenticationMiddleware', 'django.contrib.messages.middleware.MessageMiddleware', 'django.middleware.clickjacking.XFrameOptionsMiddleware'] Traceback (most recent call last): File "/home/beny/Documents/Projects/Python/Development/eCommerceV2/lib/python3.8/site-packages/django/core/handlers/exception.py", line 47, in inner response = get_response(request) File "/home/beny/Documents/Projects/Python/Development/eCommerceV2/lib/python3.8/site-packages/django/core/handlers/base.py", line 181, in _get_response response = wrapped_callback(request, *callback_args, **callback_kwargs) File "/home/beny/Documents/Projects/Python/Development/eCommerceV2/lib/python3.8/site-packages/django/views/generic/base.py", line 70, in view return self.dispatch(request, *args, **kwargs) File "/home/beny/Documents/Projects/Python/Development/eCommerceV2/lib/python3.8/site-packages/django/views/generic/base.py", line 98, in dispatch return handler(request, *args, **kwargs) File "/home/beny/Documents/Projects/Python/Development/eCommerceV2/src/accounts/views.py", line 63, in post return self.form_valid(form) File "/home/beny/Documents/Projects/Python/Development/eCommerceV2/src/accounts/views.py", line 74, in form_valid new_activation.send_activation_email() File "/home/beny/Documents/Projects/Python/Development/eCommerceV2/src/accounts/models.py", line 202, in send_activation_email response = sg.send(sent_mail) File "/home/beny/Documents/Projects/Python/Development/eCommerceV2/lib/python3.8/site-packages/sendgrid/base_interface.py", line 60, in send message = message.get() Exception Type: AttributeError at /account/email/resend-activation/ Exception Value: 'int' object has no attribute 'get'
Комментарии:
1. Покажите нам полную обратную запись об ошибке!
2. @КлаусД. К сожалению, единственная возвращенная ошибка отображается в консоли: исключение («объект’int’ не имеет атрибута» get»»). Есть ли способ заставить блок try запустить полную обратную трассировку?
3. а) удалите его б) добавьте простое
raise
вexcept
блок.4. @КлаусД. Обновленный
5.
sg.send(sent_mail)
отправит возвращаемое значениеsend_mail()
, которое может быть только0
или1
. Похоже, там нужен словарь.