Объект 'list' не имеет атрибута 'get' - GraphQL Python - PullRequest
0 голосов
/ 02 марта 2020

Я следовал этому простому примеру о том, как аутентификация graphql работает с sendgrid ... Я буквально скопировал весь код и настроил все файлы. Здесь -> https://blog.learningdollars.com/2019/10/14/how-to-confirm-emails-on-your-django-graphql-api-using-sendgrid/

После того, как я запустил мутацию, createUser я получил ошибку ' list' объект не имеет атрибута 'get'

схема .py

import graphene
from django.contrib.auth import authenticate
from graphene_django import DjangoObjectType
from graphql_jwt.utils import jwt_encode, jwt_payload
from .models import User
from .send_email import send_confirmation_email


class UserType(DjangoObjectType):
    class Meta:
        model = User


class CreateUser(graphene.Mutation):
    message = graphene.String()
    user = graphene.Field(UserType)

    class Arguments:
        username = graphene.String()
        email = graphene.String(required=True)
        password = graphene.String(required=True)

    def mutate(self, info, username, email, password):
        user = User(
            email=email,
            username=username,
        )
        user.set_password(password)
        user.save()
        send_confirmation_email(email=user.email, username=user.username)
        return CreateUser(user=user, message="Successfully created user, {}".format(user.username))


class LoginUser(graphene.Mutation):
    user = graphene.Field(UserType)
    message = graphene.String()
    token = graphene.String()
    verification_prompt = graphene.String()

    class Arguments:
        email = graphene.String()
        password = graphene.String()

    def mutate(self, info, **kwargs):
        email = kwargs.get('email')
        password = kwargs.get('password')
        user = authenticate(username=email, password=password)
        error_message = 'Invalid login credentials'
        success_message = "You logged in successfully."
        verification_error = 'Your email is not verified'
        if user:
            if user.is_verified:
                payload = jwt_payload(user)
                token = jwt_encode(payload)
                return LoginUser(token=token, message=success_message)
            return LoginUser(message=verification_error)
        return LoginUser(message=error_message)


class Mutation(graphene.ObjectType):
    create_user = CreateUser.Field()
    login_user = LoginUser.Field()

Простой пользователь модели с некоторыми мутациями внутри этого файла схемы. Я знаю, что у dict не может быть метода get, но я не могу обнаружить ошибку в этом коде. Основная проблема заключается в том, что я скопировал весь код из этого урока и ничего не изменил.

РЕДАКТИРОВАТЬ:

Я только что обнаружил ошибку его в send_mail.py

Мне нужно было удалить [email] и импортировать из sendgrid.helpers.mail import Mail, Email

Теперь я могу создать пользователя без ошибок, но проблема в том, что я не получаю электронную почту на свой почтовый аккаунт. Sendgrid не будет работать.

После этого я попытался запустить файл python send_email.py и получил еще одну ошибку.

из dota.settings import SECRET_KEY, DOMAIN, SENDGRID_API_KEY ModuleNotFoundError: Нет модуля с именем 'dota'

https://prnt.sc/rajz6c

И мой файл настроек, в который я положил SECRET_KEY, DOMAIN и SENDGRID_APIKEY, находится в папке dota. Я не знаю, почему он не импортирует его так, как должен.

send_mail.py

import jwt
from sendgrid import SendGridAPIClient
from sendgrid.helpers.mail import Mail, Email
from django.template.loader import render_to_string
from dota.settings import SECRET_KEY, DOMAIN, SENDGRID_API_KEY


def send_confirmation_email(email, username):
    token = jwt.encode({'user': username}, SECRET_KEY,
                       algorithm='HS256').decode('utf-8')
    context = {
        'small_text_detail': 'Thank you for '
                             'creating an account. '
                             'Please verify your email '
                             'address to set up your account.',
        'email': email,
        'domain': DOMAIN,
        'token': token,
    }
    # locates our email.html in the templates folder
    msg_html = render_to_string('email.html', context)
    message = Mail(
        # the email that sends the confirmation email
        from_email=Email('example@gmail.com'),
        to_email=Email('veljko33614@its.edu.rs'),  # list of email receivers
        subject='Account activation',  # subject of your email
        content=msg_html
    )
    try:
        sg = SendGridAPIClient(apikey=SENDGRID_API_KEY)
        sg.send(message)
    except Exception as e:
        return str(e)

Отслеживание ошибок:

C: \ Users \ Veljko \ Desktop \ Рабочий стол \ Dev \ dota2-api \ users> python send_email.py

Traceback (последний вызов был последним): файл "send_email.py", строка 5, из dota.settings import SECRET_KEY , DOMAIN, SENDGRID_API_KEY ModuleNotFoundError: нет модуля с именем 'dota'

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