Объект шаблонной почты Django 'dict' не имеет атрибута 'get_host' - PullRequest
0 голосов
/ 10 ноября 2018

Я пытаюсь отправить письмо с подтверждением после того, как пользователь зарегистрирует учетную запись с помощью django-templated-mail. Это ошибка, которую я получаю после создания пользователя: AttributeError 'dict' object has no attribute 'get_host'

Итак, Джанго пытается вызвать get_host () и не может? Так что это ошибка, потому что она не может получить имя моего хоста? Кто-то может указать, что я здесь скучаю?

class UserListView(generics.ListCreateAPIView):

    serializer_class = UserSerializer

    def perform_create(self, serializer):
        user = serializer.save()
        context = {'user': user}
        to = user.email
        email.ActivationEmail(context).send(to)

class UserSerializer(serializers.ModelSerializer):

    class Meta:
        model = User
        fields = ('id', 'password', 'email')
        extra_kwargs = {'password': {'write_only': True}}

    def create(self, validated_data):
        password = validated_data.pop('password')
        user = super(UserSerializer, self).create(validated_data)
        user.set_password(password)
        user.save()
        return user

class ActivationEmail(BaseEmailMessage):
    template_name = 'email/activation.html'

    def get_context_data(self):
        context = super(ActivationEmail, self).get_context_data()

        user = context.get('user')
        context['uid'] = utils.encode_uid(user.pk)
        context['token'] = default_token_generator.make_token(user)
        context['url'] = 'verify/{uid}/{token}'.format(**context)
        return context

Traceback:

Environment:


Request Method: POST
Request URL: http://localhost:8000/users/

Django Version: 2.0
Python Version: 3.6.6
Installed Applications:
['django.contrib.admin',
 'django.contrib.auth',
 'django.contrib.contenttypes',
 'django.contrib.sessions',
 'django.contrib.messages',
 'django.contrib.staticfiles',
 'rest_framework',
 'corsheaders',
 'templated_mail',
 'accounts',]
Installed Middleware:
['django.middleware.security.SecurityMiddleware',
 'django.contrib.sessions.middleware.SessionMiddleware',
 'corsheaders.middleware.CorsMiddleware',
 'django.middleware.common.CommonMiddleware',
 'django.middleware.csrf.CsrfViewMiddleware',
 'django.contrib.auth.middleware.AuthenticationMiddleware',
 'django.contrib.messages.middleware.MessageMiddleware',
 'django.middleware.clickjacking.XFrameOptionsMiddleware',
 'simple_history.middleware.HistoryRequestMiddleware']



Traceback:

File "/usr/local/lib/python3.6/site-packages/django/core/handlers/exception.py" in inner
  35.             response = get_response(request)

File "/usr/local/lib/python3.6/site-packages/django/core/handlers/base.py" in _get_response
  128.                 response = self.process_exception_by_middleware(e, request)

File "/usr/local/lib/python3.6/site-packages/django/core/handlers/base.py" in _get_response
  126.                 response = wrapped_callback(request, *callback_args, **callback_kwargs)

File "/usr/local/lib/python3.6/site-packages/django/views/decorators/csrf.py" in wrapped_view
  54.         return view_func(*args, **kwargs)

File "/usr/local/lib/python3.6/site-packages/django/views/generic/base.py" in view
  69.             return self.dispatch(request, *args, **kwargs)

File "/usr/local/lib/python3.6/site-packages/rest_framework/views.py" in dispatch
  483.             response = self.handle_exception(exc)

File "/usr/local/lib/python3.6/site-packages/rest_framework/views.py" in handle_exception
  443.             self.raise_uncaught_exception(exc)

File "/usr/local/lib/python3.6/site-packages/rest_framework/views.py" in dispatch
  480.             response = handler(request, *args, **kwargs)

File "/usr/local/lib/python3.6/site-packages/rest_framework/generics.py" in post
  244.         return self.create(request, *args, **kwargs)

File "/usr/local/lib/python3.6/site-packages/rest_framework/mixins.py" in create
  21.         self.perform_create(serializer)

File "/code/accounts/views.py" in perform_create
  54.         email.ActivationEmail(context).send(to)

File "/usr/local/lib/python3.6/site-packages/templated_mail/mail.py" in send
  69.         self.render()

File "/usr/local/lib/python3.6/site-packages/templated_mail/mail.py" in render
  61.         context = make_context(self.get_context_data(), request=self.request)

File "/code/accounts/email.py" in get_context_data
  12.         context = super(ActivationEmail, self).get_context_data()

File "/usr/local/lib/python3.6/site-packages/templated_mail/mail.py" in get_context_data
  33.             site = get_current_site(self.request)

File "/usr/local/lib/python3.6/site-packages/django/contrib/sites/shortcuts.py" in get_current_site
  16.         return RequestSite(request)

File "/usr/local/lib/python3.6/site-packages/django/contrib/sites/requests.py" in __init__
  10.         self.domain = self.name = request.get_host()

Exception Type: AttributeError at /users/
Exception Value: 'dict' object has no attribute 'get_host'

Большое спасибо за любую помощь, которую вы можете оказать.

Ответы [ 2 ]

0 голосов
/ 10 ноября 2018

ActivationEmail принимает request в качестве первого позиционного аргумента своего инициализатора. Вы передаете context в качестве первого позиционного аргумента, в результате чего ActivationEmail падает.

Обязательно передайте экземпляр request, а также context в ActivationEmail при его создании.

email.ActivationEmail(self.request, context).send(to)
0 голосов
/ 10 ноября 2018

Вы создали ActivationEmail неправильно. Параметр request должен быть объектом HttpRequest вместо dict.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...