django - 每当 API 中的 POST 请求时发送邮件
问题描述
我正在使用 django 和 django-rest-framework 来提供一些 API。Vue.js 用于将这些 API 作为前端框架进行交互。我能够在“Axios”的帮助下发送 POST 请求数据,并且数据保存在 django 中。
我想在 POST 请求发生时发送邮件。最初,当我使用 django-forms 时,发送邮件很容易,因为我会在 form.save() 之前发送邮件。但现在我有点困惑
视图.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.
路由器.py
from clientforms.views import StudentQueryViewSet
router.register(r'student-query', StudentQueryViewSet)
网址.py
from .routers import router
urlpatterns = [
path('admin/', admin.site.urls),
path('api/', include(router.urls)),
]
解决方案
您应该删除对的调用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
。)
推荐阅读
- node.js - 带有“export * as”语法的 node_modules 包中的打字稿错误
- java - 由于某种原因,当我使用带有 LocalDateTime 变量的 Spring Boot 时,不会创建我的数据库
- php - Laravel 路由存在但无法查看页面
- c++ - 如何将 N 位写入 QByteArray
- reactjs - 将焦点更改为另一个文本框时清除 React 中的文本输入
- java - getter 的返回类型是否与 setter 的参数类型匹配?
- binary-search-tree - 如果在 BST 中获取中序后继需要 O(h),为什么在调用 O(h) 函数 n 次时迭代中序遍历需要 O(n)?
- discord.py - Discord Bot 崩溃:typeerror __new__() 有一个意外的关键字参数“deny_new”
- windows - Visual Basic 安装工具包的安装引导程序 - EXE - 静默安装 (VB6)
- reactjs - How to call Azure AD Secured Azure Functions from ReactJS Application