如何使用 django 和 instagram api 实时 POST 更新?
How get in real time POST update with django and instagram api?
我尝试使用 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
我的 django 视图调用回调 url(我 运行 它在远程网络服务器上):
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 上 post 一张带有标签 "test" 的图片时,我认为它没有调用,我的网络服务器终端中有:
[20/Jan/2015 13:31:24] "POST /insta HTTP/1.1" 500 65563
为什么我的 post instagram 图片没有调用我的视图?
似乎 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)
显示的代码似乎根本无法处理 POST 请求。它只打印出 "post" 和 returns 什么都没有。
网络服务器日志显示 HTTP 500 错误(内部服务器错误)和一个 64KiB 错误页面,可能会告诉您确切原因。
您需要为 POST 请求实现一个处理程序,这个处理程序可能类似于您已有的 GET 处理程序。
您需要更正回调 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
另请参阅:
我尝试使用 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
我的 django 视图调用回调 url(我 运行 它在远程网络服务器上):
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 上 post 一张带有标签 "test" 的图片时,我认为它没有调用,我的网络服务器终端中有:
[20/Jan/2015 13:31:24] "POST /insta HTTP/1.1" 500 65563
为什么我的 post instagram 图片没有调用我的视图?
似乎 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)
显示的代码似乎根本无法处理 POST 请求。它只打印出 "post" 和 returns 什么都没有。
网络服务器日志显示 HTTP 500 错误(内部服务器错误)和一个 64KiB 错误页面,可能会告诉您确切原因。
您需要为 POST 请求实现一个处理程序,这个处理程序可能类似于您已有的 GET 处理程序。
您需要更正回调 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
:
[20/Jan/2015 13:31:24] "POST /insta HTTP/1.1" 500 65563
另请参阅: