Я следовал этому простому примеру о том, как аутентификация 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'