[英]how to match an url with django urlconf?
我正在实施一个名为mercadopago的支付模块(如paypal),我需要处理一个http请求,当有人通过此类网址中的信息进行付款(IPN)时,该请求会发送到我的网站:
POST / notifications?topic = payment&id = identificador-de-notificacion-de-pago
(mercadopago每次付款时都会向我的网站发送POST请求)
但我不能使它与django网址系统匹配。 我尝试了以下网址:
url(r'^notifications$', 'views.notifications', name='notifications'),
我尝试了不同的组合,并咨询了apache日志文件,并告诉我错误500
移动网址的视图如下:
@csrf_exempt
def IpnProxy(request, **kwargs):
mp = mercadopago.MP("*********", "*********")
paymentInfo = mp.get_payment_info(kwargs["id"])
if paymentInfo["status"] == 200:
return paymentInfo["response"]
else:
return None
我不知道是否必须配置singals或其他东西。
也许即时通讯错误,但mercadopago向我的服务器发出邮件请求,我无法改变它。 这是他们的文档http://developers.mercadopago.com/documentation/instant-payment-notifications?lang=en_US这里是他们在python中的示例项目: https : //github.com/mercadopago/sdk-python/blob/主/例子/即时付款通知/ receive-ipn.py
之后的一切?
mark是一个带有请求GET参数的Query字符串 。 它们不包含在urls.py
的url模式中:
url(r'^notifications/$', view_notifications)
从视图中的request.GET
QueryDict
获取GET
参数:
def view_notifications(request):
topic = request.GET.get('topic')
print topic
也可以看看:
您正在为Django中的POST错误地编码参数。 POST请求将其参数编码在请求正文中。 请查看Django的请求和响应对象文档。 如果您确实想使用您提供的URL,则需要使用GET而不是POST。
---编辑---
尝试以下操作:在导入通知后的urls.py文件中。
url(r'^notification$', notification, name='notification')
在您的settings.py中:
APPEND_SLASH=False
您几乎肯定需要转换CSRF保护,因为您没有CSRF cookie。
您将能够按如下方式检索参数:
def notification(request, **kwargs):
body = "topic = '{0}'\nid = '{1}'\n".format(request.GET.get('topic'), request.GET.get('id'))
response = HttpResponse(body, content_type="text/plain")
return response
测试然后给我们:
hackworth:~$ curl -X POST "http://127.0.0.1:8000/notification?topic=payment&id=identificador-de-notificacion-de-pago"
topic = 'payment'
id = 'identificador-de-notificacion-de-pago'
以上所有都是一个坏主意,因为POST请求通常有一个正文,而Django实际上并不期望POST url上的查询参数。 此外,现在存在一个安全漏洞,因为必须关闭CSRF保护才能使其工作。
文档的读取方式,您将收到来自mercadopago的URL,您可以使用get请求进行检索。 目前尚不清楚他们是否会向您发送带有查询参数的POST请求。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.