【问题标题】:Django and Stripe MultiValueDictKeyError at /checkout/ "'stripeToken'"/checkout/“'stripeToken'”处的 Django 和 Stripe MultiValueDictKeyError
【发布时间】:2021-07-17 14:37:23
【问题描述】:
    views.py
    from django.conf import settings
    from django.shortcuts import render
    from django.contrib.auth.decorators import login_required
    import stripe


    stripe.api_key = settings.STRIPE_SECRET_KEY

    # Create your views here.
    @login_required
    def checkout(request):
        publishKey = settings.STRIPE_PUBLISHABLE_KEY
        if request.method == 'POST':
            token = request.POST['stripeToken']
                try:
                stripe.Charge.create(
                    amount=1000,
                    currency="usd",
                    card=token,


                    description="Charge for test@example.com"
    )
            except stripe.CardError:
                # The card has been declined
                pass
            # Create the charge on Stripe's servers - this will charge the user's card

        context = {'publishKey': publishKey

                    }
        template = 'checkout.html'
        return render(request, template, context)



When i run my views.py gives me this error -    MultiValueDictKeyError at /checkout/
"'stripeToken'"

here is my checkout.py
MultiValueDictKeyError at /checkout/
"'stripeToken'"

那是我的 checkout.py 请帮忙,我将不胜感激。 我最终建立了一个网站来接受付款,但是当我运行它时,我得到了那个错误,我认为它来自views.py,但我不确定是否想从一些djangonites或pythoners那里得到一些反馈,谢谢

【问题讨论】:

    标签: python django stripe-payments


    【解决方案1】:

    当请求的键(在本例中为stripeToken)在request.POST 中不存在时,Django 会引发this error。您可能需要检查您的POST 表单数据以获取您的请求。

    【讨论】:

      【解决方案2】:
      >>> from django.utils.datastructures import MultiValueDict as MVD
      >>> data = MVD({'name': ['John'], 'email': ['j@yahoo.com']})
      >>> data['name']
      'John'
      >>> data['email']
      'j@yahoo.com'
      

      这个类[MultiValueDict]的存在是为了解决烦人的问题 由 cgi.parse_qs 引发,它为每个键返回一个列表,甚至 尽管大多数 Web 表单都提交单个名称-值对。


      cgi.parse_qs:解析作为字符串参数给出的查询字符串(application/x-www-form-urlencoded 类型的数据)。数据返回为 一本字典。字典键是唯一的查询变量名称 并且这些值是每个名称的值列表。


      现在有一个不存在的密钥:

      >>> data['apple']
      Traceback (most recent call last):
        File "<console>", line 1, in <module>
        File "/Users/7stud/.virtualenvs/django186p34/lib/python3.4/site-packages/django/utils/datastructures.py", line 322, in __getitem__
          raise MultiValueDictKeyError(repr(key))
      django.utils.datastructures.MultiValueDictKeyError: "'apple'"
      

      看看最后一行是怎么写的...MultiValueDictKeyError: "'apple'"?看看上面 django 控制台中创建的 MultiValueDict 中如何不存在密钥 'apple'

      看看你是怎么写的:

      request.POST['stripeToken']
      

      你也遇到了类似的错误?? request.POST 是一个 MultiValueDict,它包含来自 POST 数据的键/值对。错误是说"stripeToken" 不是 MultiValueDict 中的键,这意味着 POST 数据中没有键/值对,键为 'stripeToken'

      如果数据来自 html 表单,这意味着没有将其name 属性设置为“stripeToken”的表单输入元素,例如

      <input type="text" name="stripeToken">
      

      【讨论】:

        【解决方案3】:

        我遇到了同样的问题,问题的原因在 checkout.html 中。我正在使用这个

         Stripe.setPublishableKey({{ publishkey }});
        

        代替

        Stripe.setPublishableKey('{{ publishkey }}');
        

        纠正它为我解决了错误

        【讨论】:

          【解决方案4】:

          刷新您的可发布和秘密 api 密钥,删除所有测试数据,然后尝试在您的终端上应用打印令牌以查看其是否真正通过:

          if 'stripeToken' in request.POST:   
                  print(request.POST['stripeToken'])
          

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 2018-04-13
            • 2015-10-07
            • 1970-01-01
            • 2020-01-13
            • 2019-04-20
            • 2020-05-24
            • 2021-11-30
            相关资源
            最近更新 更多