Отправка почты при каждом запросе POST в API - PullRequest
0 голосов
/ 12 сентября 2018

Я использую django и django-rest-framework для обслуживания некоторых API.Vue.js используется для взаимодействия этих API в качестве инфраструктуры внешнего интерфейса.Я могу отправить данные запроса POST с помощью «Axios», и данные сохраняются в Django.

Я хочу отправлять почту всякий раз, когда происходит запрос POST.Изначально, когда я использовал django-формы, отправка почты была легкой, потому что я отправлял send_mail непосредственно перед form.save ().Но теперь я немного запутался

views.py

class StudentQueryViewSet(viewsets.ModelViewSet):
  queryset = StudentQuery.objects.all()
  serializer_class = StudentQuerySerializer

  def create(self, request, *args, **kwargs):
    query=self.get_object()
    serializer = StudentQuerySerializer(data=request.DATA)
    if serializer.is_valid():
      serializer.save()
      msg = "A new query has been added in Category" + str(query.category)
      msg += "\n Name: " + query.name
      msg += "\n Contact: " + str(query.contact)
      msg += "\n Subject: " + str(query.subjects)
      msg += "\n Standard: " + str(query.standard)
      msg += "\n Address: " + str(query.address)
      send_mail(emailSubject, message, emailFrom, emailList, fail_silently=False)
      return Response(serializer.data, status=status.HTTP_201_CREATED)
    return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)

Когда я использовал этот метод создания, я столкнулся с ошибкой утверждения.Вот обратная связь

Internal Server Error: /api/student-query/
Traceback (most recent call last):
  File "/home/f1uk3r/.virtualenvs/edhusk-project/lib/python3.5/site-packages/django/core/handlers/exception.py", line 34, in inner
    response = get_response(request)
  File "/home/f1uk3r/.virtualenvs/edhusk-project/lib/python3.5/site-packages/django/core/handlers/base.py", line 126, in _get_response
    response = self.process_exception_by_middleware(e, request)
  File "/home/f1uk3r/.virtualenvs/edhusk-project/lib/python3.5/site-packages/django/core/handlers/base.py", line 124, in _get_response
    response = wrapped_callback(request, *callback_args, **callback_kwargs)
  File "/home/f1uk3r/.virtualenvs/edhusk-project/lib/python3.5/site-packages/django/views/decorators/csrf.py", line 54, in wrapped_view
    return view_func(*args, **kwargs)
  File "/home/f1uk3r/.virtualenvs/edhusk-project/lib/python3.5/site-packages/rest_framework/viewsets.py", line 103, in view
    return self.dispatch(request, *args, **kwargs)
  File "/home/f1uk3r/.virtualenvs/edhusk-project/lib/python3.5/site-packages/rest_framework/views.py", line 483, in dispatch
    response = self.handle_exception(exc)
  File "/home/f1uk3r/.virtualenvs/edhusk-project/lib/python3.5/site-packages/rest_framework/views.py", line 443, in handle_exception
    self.raise_uncaught_exception(exc)
  File "/home/f1uk3r/.virtualenvs/edhusk-project/lib/python3.5/site-packages/rest_framework/views.py", line 480, in dispatch
    response = handler(request, *args, **kwargs)
  File "/home/f1uk3r/Coding/edhusk-project/edhusk2/clientforms/views.py", line 21, in create
    query=self.get_object()
  File "/home/f1uk3r/.virtualenvs/edhusk-project/lib/python3.5/site-packages/rest_framework/generics.py", line 94, in get_object
    (self.__class__.__name__, lookup_url_kwarg)
AssertionError: Expected view StudentQueryViewSet to be called with a URL keyword argument named "pk". Fix your URL conf, or set the `.lookup_field` attribute on the view correctly.

routers.py

from clientforms.views import  StudentQueryViewSet
router.register(r'student-query', StudentQueryViewSet)

urls.py

from .routers import router
urlpatterns = [
    path('admin/', admin.site.urls),
    path('api/', include(router.urls)),
]

Ответы [ 2 ]

0 голосов
/ 12 сентября 2018

Другой вариант - оставить набор и сериализатор без изменений - не переопределяя метод создания для отправки электронной почты.

И вместо этого используйте сигналы.

вы можете зарегистрировать прослушиватель для pre_save или post_save сигнал.И отправьте письмо оттуда.

Таким образом, каждый раз, когда создается новый StudentQuery и обновляется другой объект - он будет запускать слушателя для отправки электронного письма.

0 голосов
/ 12 сентября 2018

Вы должны удалить вызов на get_object и присвоить результат сохранения сериализатора на query.

def create(self, request, *args, **kwargs):
    serializer = StudentQuerySerializer(data=request.DATA)
    if serializer.is_valid():
      query = serializer.save()
      msg = "A new query has been added in Category" + str(query.category)
      ...

(Примечание: query - это вводящее в заблуждение имя, которое следует использовать здесь; я 'Мы сохранили его для согласованности с остальным кодом, но на самом деле вы должны использовать что-то вроде obj.)

...