为啥获取“WSGIRequest”对象没有属性“数据”错误?

Posted

技术标签:

【中文标题】为啥获取“WSGIRequest”对象没有属性“数据”错误?【英文标题】:why getting 'WSGIRequest' object has no attribute 'data' error?为什么获取“WSGIRequest”对象没有属性“数据”错误? 【发布时间】:2022-01-16 09:40:13 【问题描述】:

我正在尝试在 react Js 和 Django 中通过条纹使用卡支付。我正在关注https://betterprogramming.pub/how-to-integrate-django-react-app-with-stripe-payments-95709b3f23e5这个教程。

前端

const handleSubmit = async (event) => 
    event.preventDefault();
    const card = elements.getElement(CardElement);
    const paymentMethod, error = await stripe.createPaymentMethod(
      type: 'card',
      card: card
  );
  ApiService.saveStripeInfo(
    email, payment_method_id: paymentMethod.id)
  .then(response => 
    console.log(response.data);
  ).catch(error => 
    console.log(error)
  )

export const api = axios.create(
  baseURL: API_URL,
  headers: 
    "Content-type": "application/json"
  
);
export default class ApiService
  static saveStripeInfo(data=)
    return api.post(`$API_URL/payments/save-stripe-info/`, data)
  

服务器

@api_view(['POST'])
def test_payment(request):
    test_payment_intent = stripe.PaymentIntent.create(
    amount=1000, currency='pln', 
    payment_method_types=['card'],
    receipt_email='test@example.com')
    return Response(status=status.HTTP_200_OK, data=test_payment_intent)
        
def save_stripe_info(request):
    print('this => ',request.data)
    data = request.data
    email = data['email']
    payment_method_id = data['payment_method_id']
    
    # creating customer
    customer = stripe.Customer.create(
      email=email, payment_method=payment_method_id)
     
    return Response(status=status.HTTP_200_OK, 
      data=
        'message': 'Success', 
        'data': 'customer_id': customer.id 
        
    )       

但是每当我点击提交按钮时,它都会给我以下错误

AttributeError: 'WSGIRequest' 对象没有属性 'data' [12/Dec/2021 21:55:57]“POST /payments/save-stripe-in​​fo/HTTP/1.1”500 71355

完整代码请访问https://betterprogramming.pub/how-to-integrate-django-react-app-with-stripe-payments-95709b3f23e5

【问题讨论】:

【参考方案1】:

根据docs 没有WSGIRequest 的数据成员。您将需要参考 body 属性。

【讨论】:

我无法理解,请多描述一点@LajosArpad @Ruma 如果你有一个对象,我们称它为foo,然后引用foo.bar 将产生如果foo 没有名为bar 的成员时你遇到的错误。由于您的 request 对象属于 WSGIRequest 类型,因此您需要引用该类型的数据成员,这在我的答案中已链接到。因为在仔细查看文档后,您会得出结论,对于此类对象没有名为 data 的成员,因此很正常,甚至更预期您会收到您在问题中提到的错误。因此,您将需要寻找替代方案。既然那种物体 @Ruma 有一个名为body 的成员,您需要引用它,所以将data = request.data 更改为data = request.body,看看body 包含什么。我不是 Python 程序员,所以我在为您编写示例代码时犹豫不决,因为它可能包含语法错误,但您肯定需要在我提到的行中使用 body 而不是 data【参考方案2】:

数据是 rest_framework 的一部分。您需要使用 api_view 来装饰视图。

只需在 def save_stripe_info(request) 之前添加“@api_view(['POST'])”。 应该是:

@api_view(['POST'])
def save_stripe_info(request):
    print('this => ',request.data)
    data = request.data
    email = data['email']
    payment_method_id = data['payment_method_id']
    
    # creating customer
    customer = stripe.Customer.create(
      email=email, payment_method=payment_method_id)
     
    return Response(status=status.HTTP_200_OK, 
      data=
        'message': 'Success', 
        'data': 'customer_id': customer.id 
        
    )  

或者只是在 json 中加载正文。

data = json.loads(request.body)

【讨论】:

以上是关于为啥获取“WSGIRequest”对象没有属性“数据”错误?的主要内容,如果未能解决你的问题,请参考以下文章

/admin/ 'WSGIRequest' 对象的 AttributeError 没有属性 'user'

AttributeError:“WSGIRequest”对象没有属性“会话”

AttributeError:“WSGIRequest”对象没有属性“is_ajax”

Django 测试用例错误“WSGIRequest”对象没有属性“会话”

将数据从 JSON 导入 django AttributeError:“WSGIRequest”对象没有属性“数据”

Django(25)WSGIRequest对象