【问题标题】:How get in real time POST update with django and instagram api?如何使用 django 和 instagram api 进行实时 POST 更新?
【发布时间】:2015-01-20 12:37:55
【问题描述】:

我尝试使用python-instagram 获取实时 instagram 的媒体。

我使用带有标签的 api.create_subscription。我的回调 url 是远程 Web 服务器上的 django 网页。 我的 python 脚本(我在本地计算机上运行它):

api = InstagramAPI(client_id='my_id', client_secret='my_secret')
sub = api.create_subscription(object='tag', object_id='test', aspect='media', callback_url=my_url/insta)
print sub

while 1:
    pass

我通过回调 url 调用 django 视图(我在远程 Web 服务器上运行它):

def getInstagramPicture(request):
    if request.method == "GET":
        mode         = request.GET.get("hub.mode")
        challenge    = request.GET.get("hub.challenge")
        verify_token = request.GET.get("hub.verify_token")
        return HttpResponse(challenge)
    if request.method == "POST":
        print "post"

我认为订阅效果很好。 Web 服务器终端日志:

[20/Jan/2015 13:30:11] "GET /insta?hub.challenge=1aed90578d1743a3afb865cc2a6b69cc&hub.mode=subscribe HTTP/1.1" 301 0
[20/Jan/2015 13:30:11] "GET /insta/?hub.challenge=1aed90578d1743a3afb865cc2a6b69cc&hub.mode=subscribe HTTP/1.1" 200 32

以及本地终端日志:

sub {'meta': {'code': 200}, 'data': {'object': 'tag', 'object_id': 'test', 'aspect': 'media', 'callback_url': 'my_url/insta', 'type': 'subscription', 'id': '15738925'}}

但我的问题是,当我尝试在 Instagram 上发布带有“测试”标签的图片时,我的视图没有被调用,而我的网络服务器终端中有:

[20/Jan/2015 13:31:24] "POST /insta HTTP/1.1" 500 65563

为什么我在 Instagram 上发布图片时没有调用我的视图?

【问题讨论】:

标签: python django real-time instagram instagram-api


【解决方案1】:

您需要更正回调 url 以匹配 urlconf 中定义的内容。您目前告诉 Instagram 您的回调 url 是 <server>/insta,但从请求日志看来,您的 urlconf 正在等待 <server>/insta/(带有斜杠)

这适用于 GET 请求,如下所示

[20/Jan/2015 13:30:11] "GET /insta?hub.challenge=1aed90578d1743a3afb865cc2a6b69cc&hub.mode=subscribe HTTP/1.1" 301 0
[20/Jan/2015 13:30:11] "GET /insta/?hub.challenge=1aed90578d1743a3afb865cc2a6b69cc&hub.mode=subscribe HTTP/1.1" 200 32

(注意第一行是301重定向)

Django 的默认APPEND_SLASH 设置确保对/insta 的请求会自动重定向到您定义的/insta/ 视图。

但是 Django 不能对 POST 请求执行此操作... HTTP 重定向始终是 GET 请求,因此 POST 数据会丢失。这就是当对不存在的 url /insta 发出 POST 请求时,您会在日志中看到 500 错误的原因:

[20/Jan/2015 13:31:24] "POST /insta HTTP/1.1" 500 65563

另请参阅:https://stackoverflow.com/a/9739046/202168

【讨论】:

  • 好的,非常感谢您的帮助!现在可以了!
【解决方案2】:

显示的代码似乎根本无法处理 POST 请求。它只是打印出“post”并且什么都不返回。

Web 服务器日志显示 HTTP 500 错误(内部服务器错误)和 64KiB 错误页面,可能会告诉您确切的原因。

您需要为 POST 请求实现一个处理程序,该处理程序可能与您已有的 GET 处理程序类似。

【讨论】:

  • 我尝试使用返回 HttpResponse 实现 POST 处理程序,但没有任何改变。我不明白,因为看起来我的观点没有被调用。
  • 查看 Web 服务器错误日志 - 您可能会在那里发现 500 内部服务器错误发生的原因。也许请求在被分派到您的视图之前失败。
【解决方案3】:

好像 instagram 使用 POST 方法来访问你的回调 url。

试试这个:

from django.views.decorators.csrf import csrf_exempt

@csrf_exempt
def getInstagramPicture(request):
    if request.method == "GET":
        mode         = request.GET.get("hub.mode")
        challenge    = request.GET.get("hub.challenge")
        verify_token = request.GET.get("hub.verify_token")
        return HttpResponse(challenge)
    if request.method == "POST":
        mode         = request.POST.get("hub.mode")
        challenge    = request.POST.get("hub.challenge")
        verify_token = request.POST.get("hub.verify_token")
        return HttpResponse(challenge)

【讨论】:

  • 同样的结果,当我在 Instagram 上发布照片时,我的视图没有被调用。
  • 您的视图使用POST方法调用的。
猜你喜欢
  • 2012-10-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-03-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多