LemonSqueezy webhook 请求以 GET 而不是 POST 的形式发送,为什么?

问题描述 投票:0回答:1

我有一个 python/django 应用程序,通过 Cloudflare 托管在 PythonAnywhere、DNS 和 SSL 上,并使用 LemonSqueezy 处理付款。根据 docs,LemonSqueezy 应通过 POST 将 webhook 发送到我在创建订单时提供的 URL。他们确实发送了一个 webhook,但它是一个空正文的 GET 请求,我不明白为什么。

我能够使用 Postman 成功地将 POST 请求发送到我的本地版本和我的实时版本的网站,所以我不认为这是我的服务器的配置问题。但是,我能够在 webhook.site(测试 webhooks 的网站)上成功接收 POST webhook。所以我认为 LemonSqueezy webhook 也没有损坏。

我测试了 Cloudflare 代理的 DNS 记录的多种变体,无论是否有 Cloudflare SSL 证书,以及是否有来自 Pythonanywhere 的 Let's Encrypt SSL 证书。我还测试了各种 SSL/TLS 模式。在所有实际导致页面加载成功的组合中,我始终能够从 Postman 获取 POST 请求,但只能从 LemonSqueezy 获取 GET 请求。不要认为这是代码问题,但包括我正在使用的调试代码。

@csrf_exempt
def lemonsqueezy(request):
    logging.info(f'Body: {request.body}')
    logging.info(f'Scheme: {request.scheme}')
    logging.info(f'Method: {request.method}')
python django cloudflare pythonanywhere
1个回答
0
投票

当然,在发布几分钟后就解决了这个问题。

如果 URL 没有尾部斜杠来匹配定义的 URL 路径,Django 会将 POST 请求重写为 GET,否则显然它们会转换为 GET 请求。如果您 POST 到 example.com/my-webhook,但路径定义为 example.com/my-webhook/,则会添加尾部斜杠,但它将成为 get 请求。

似乎有一种方法可以使用 settings.py 中的 APPEND_SLASH 设置来更改此行为,或者将 urls.py 路由从 path() 更改为 re_path() 以使斜杠可选......即

re_path(r'my-webhook/?$', views.my_webhook, name="my-webhook")
© www.soinside.com 2019 - 2024. All rights reserved.