如何将网址与django urlconf匹配?

时间:2014-07-18 20:21:35

标签: python django url urlconf

我正在实施名为mercadopago的支付模块(如paypal),我需要处理当有人通过此类网址中的信息进行付款(IPN)时发送到我网站的http请求:

  

POST / notifications?topic = payment& id = identificador-de-notificacion-de-pago

(mercadopago每次付款时都会向我的网站发送POST请求)

但是我不能让它与django url系统匹配。我尝试了以下网址:

    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/master/examples/instant-payment-notifications/receive-ipn.py

2 个答案:

答案 0 :(得分:2)

?标记后面的所有内容都是带有请求GET参数的Query string。它们未包含在urls.py中的网址格式中:

url(r'^notifications/$', view_notifications)

在视图中获取request.GET GET的{​​{1}}个参数:

QueryDict

另见:

答案 1 :(得分:2)

您正在为Django中的POST错误地编码参数。 POST请求将其参数编码在请求正文中。请查看Django的Request and response objects文档。如果您真的想使用您提供的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网址上的查询参数。此外,现在存在一个安全漏洞,因为必须关闭CSRF保护才能使其正常工作。

文档的读取方式,您将收到来自mercadopago的URL,您可以使用get请求进行检索。目前尚不清楚他们是否会向您发送带有查询参数的POST请求。