Django集成iyzipay虚拟POS出现'dict' object has no attribute 'META'报错
报错原因及修复方案
核心问题
你在视图函数中覆盖了Django传入的原生request请求对象:
- 视图函数第一个参数
request是Django自动注入的HttpRequest对象,内置META等属性,供render等方法调用 - 后续你自定义支付参数字典时,同样使用了
request作为变量名,导致原有HttpRequest对象被覆盖 - 最后调用
render(request, "cart/payment.html")时,传入的request已经是字典类型,字典不存在META属性,因此触发报错
修复方法
将你自定义的支付参数字典重命名即可,比如改为payment_request,对应修改支付创建方法的入参。
修改后的核心代码如下:
@login_required(login_url="/user/login") def payment(request): options = { 'api_key': 'api_key', 'secret_key': 'secret_key', 'base_url': 'sandbox-api.iyzipay.com' } payment_card = { 'cardHolderName': 'John Doe', 'cardNumber': '5528790000000008', 'expireMonth': '12', 'expireYear': '2030', 'cvc': '123', 'registerCard': '0' } buyer = { 'id': 'BY789', 'name': 'John', 'surname': 'Doe', 'gsmNumber': '+905350000000', 'email': 'email@email.com', 'identityNumber': '74300864791', 'lastLoginDate': '2015-10-05 12:43:35', 'registrationDate': '2013-04-21 15:12:09', 'registrationAddress': 'Nidakule Göztepe, Merdivenköy Mah. Bora Sok. No:1', # 可优化:从原生请求对象获取真实访问IP,无需写死 'ip': request.META.get('REMOTE_ADDR', '85.34.78.112'), 'city': 'Istanbul', 'country': 'Turkey', 'zipCode': '34732' } address = { 'contactName': 'Jane Doe', 'city': 'Istanbul', 'country': 'Turkey', 'address': 'Nidakule Göztepe, Merdivenköy Mah. Bora Sok. No:1', 'zipCode': '34732' } basket_items = [ { 'id': 'BI101', 'name': 'Binocular', 'category1': 'Collectibles', 'category2': 'Accessories', 'itemType': 'PHYSICAL', 'price': '0.3' }, { 'id': 'BI102', 'name': 'Game code', 'category1': 'Game', 'category2': 'Online Game Items', 'itemType': 'VIRTUAL', 'price': '0.5' }, { 'id': 'BI103', 'name': 'Usb', 'category1': 'Electronics', 'category2': 'Usb / Cable', 'itemType': 'PHYSICAL', 'price': '0.2' } ] # 重命名支付参数对象,避免覆盖原生request payment_request = { 'locale': 'tr', 'conversationId': '123456789', 'price': '1', 'paidPrice': '1.2', 'currency': 'TRY', 'installment': '1', 'basketId': 'B67832', 'paymentChannel': 'WEB', 'paymentGroup': 'PRODUCT', 'paymentCard': payment_card, 'buyer': buyer, 'shippingAddress': address, 'billingAddress': address, 'basketItems': basket_items } payment = iyzipay.Payment().create(payment_request, options) return render(request, "cart/payment.html")
内容的提问来源于stack exchange,提问作者yumlusoft
相关产品推荐
相关产品推荐

