【问题标题】:Parsing POST request - object() takes no parameters解析 POST 请求 - object() 不带参数
【发布时间】:2017-02-02 07:49:34
【问题描述】:

我尝试访问发布请求并检查是否已经存在使用发布请求中的电子邮件的用户。当我尝试向端点发送数据时,出现错误

TypeError: object() takes no parameters

我的意见.py

@csrf_exempt
class CheckIfEmailAvailable():

   @csrf_exempt
   def check(request):
      email = request.POST.get("email")
      if User.objects.filter(email=email).exists():
         return Response({'status': 'not available'})

我的 url.py url(r'^api/checkmail/', CheckIfEmailAvailable, name='check'),

我做错了什么?

【问题讨论】:

    标签: django


    【解决方案1】:

    如果您发布了完整的回溯,您会看到错误不是来自解析请求; Django 甚至没有走那么远。

    您不能将类用作那样的视图。您应该将 check 作为独立函数,没有类,并直接在您的 url 中引用它。

    Django 确实支持基于类的视图,但它们具有非常特定的结构,需要从正确的基类继承,并在 urls.py 中以特定方式引用。

    【讨论】:

      【解决方案2】:

      你需要继承你的类你的通用 django 视图才能工作。 Url 模式期望一个可以接受请求(带有 args 和 kwargs)并返回响应的可调用对象。 View.as_view 类方法为您返回一个可调用对象。

      # In views file
      from django.views.generic import View
      
      ...
      
      class CheckIfEmailAvailable(View):
      
            def get(self, request, *args, **kwargs):
                return self.check(request) # or something else depends on your use case
      
      # In urls file
      from django.views.decorators.csrf import csrf_exempt
      ...
      url(r'^api/checkmail/', csrf_exempt(CheckIfEmailAvailable.as_view()), name='check'),
      

      此外,csrf_exempt 装饰器在类上不起作用(开箱即用),在绑定方法上也不起作用。更好的方法应该是在 url 中使用它们。

      【讨论】:

      • 现在它抱怨 url(r'^api/checkmail/', CheckIfEmailAvailable.as_view(), name='check'), AttributeError: 'function' object has no attribute 'as_view'
      • 移除 csrf_exempt 类装饰
      • 如果有帮助请点赞并将其标记为正确答案
      • 现在当我尝试发送请求以测试电子邮件时,它会抱怨浏览器中的 csrf
      • 对不起,我错过了您的回复。实际上它说@method_decorator(csrf_exempt) NameError: name 'method_decorator' is not defined
      【解决方案3】:

      在这种情况下最好在url中使用函数

      from your_app.views import check
      
      url(r'^api/checkmail/', check, name='check')
      

      你的视图会是这样的(只有功能)

      @csrf_exempt
      def check(request):
        email = request.POST.get("email")
        if User.objects.filter(email=email).exists():
           return JsonResponse({'status': 'not available'})
      

      另外仅供参考,如果您想在课程中使用 @csrf_exempt,您应该使用 dispatch,您可以获得更多信息 here

      JsonResponse 示例

      from django.http import JsonResponse
      def your_view(request):
          return JsonResponse({'foo':'bar'})
      

      【讨论】:

      • 它说“/Users/me/Documents/Django/datingproject/datingproject/urls.py”,第 32 行,在 url(r'^api/checkmail/', check, name ='check'), NameError: name 'check' is not defined
      • 你应该导入你的视图。请添加“从 your_app.views 导入检查”
      • 现在它说 .accepted_renderer not set on Response :(
      • 当然,如果你想发送字典,你应该使用 JsonResponse 而不是 Response。在响应中添加示例
      猜你喜欢
      • 1970-01-01
      • 2015-12-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-01-18
      相关资源
      最近更新 更多