Python — Heroku urllib2.HTTPError

Я провел последний день или около того, работая с группой над созданием приложения facebook, которое вычисляет коэффициент кластеризации пользователя (показатель взаимосвязанности его друзей).
Чтобы выполнить это, мне нужно получить число общих друзей пользователя с каждым из своих друзей. К сожалению, я продолжаю получать ошибку urllib2.HTTPError и не могу понять, что происходит. Вы можете получить доступ к приложению (и сообщению об ошибке + трассировке) по адресу https://gentle-stream-3754.herokuapp.com/.

Строка 168, в частности, была частью трассировки. Я знаю, что приведенный ниже код, скорее всего, будет бесполезен без контекста, поэтому я включил ссылку на приложение.

Может ли быть проблема с правами пользователя? Время выполнения?

Любая помощь будет оценена по достоинству! Заранее спасибо!

РЕДАКТИРОВАТЬ: access_token выглядит как объект NoneType, но я не совсем понимаю, почему. Может ли это быть причиной ошибки urllib2.HTTPError?

164 def clustering_coefficient():
165 
166     access_token = get_token()
167     g = Graph(access_token)
168     requests = [{'method': 'GET', 'relative_url': 'me/mutualfriends/%s' % x['id']} for x in g.me.friends()['data']]
169     k_v = len(requests)
170     if k_v < 2:
171         return 0.0
172 
173     n_v = 0
174     REQS_PER_POST = 50 
175     for i in range((k_v // REQS_PER_POST)+1):
176         result = g.post(batch=json.dumps(requests[i*REQS_PER_POST:(i+1)*REQS_PER_POST]))
177         for r in result:
178             body = json.loads(r['body'])
179             n_v += len(body['data'])
180 
181     return 1.0 * n_v / k_v/ (k_v-1)

Исключение: HTTPError: ошибка HTTP 400: неверный запрос

Проследить:

Traceback (most recent call last)
File "/app/lib/python2.7/site-packages/flask/app.py", line 1306, in __call__
return self.wsgi_app(environ, start_response)
File "/app/lib/python2.7/site-packages/flask/app.py", line 1294, in wsgi_app
response = self.make_response(self.handle_exception(e))
File "/app/lib/python2.7/site-packages/flask/app.py", line 1292, in wsgi_app
response = self.full_dispatch_request()
File "/app/lib/python2.7/site-packages/flask/app.py", line 1062, in full_dispatch_request
rv = self.handle_user_exception(e)
File "/app/lib/python2.7/site-packages/flask/app.py", line 1060, in full_dispatch_request
rv = self.dispatch_request()
File "/app/lib/python2.7/site-packages/flask/app.py", line 1047, in dispatch_request
return self.view_functions[rule.endpoint](**req.view_args)
File "/app/exampleapp.py", line 168, in clustering_coefficient
requests = [{'method': 'GET', 'relative_url': 'me/mutualfriends/%s' % x['id']} for x in g.me.friends()['data']]
File "/app/lib/python2.7/site-packages/facegraph/graph.py", line 157, in __call__
data = json.loads(self.fetch(self.url | params))
File "/app/lib/python2.7/site-packages/facegraph/graph.py", line 203, in fetch
conn = urllib2.urlopen(url, data=data)
File "/usr/local/lib/python2.7/urllib2.py", line 126, in urlopen
return _opener.open(url, data, timeout)
File "/usr/local/lib/python2.7/urllib2.py", line 400, in open
response = meth(req, response)
File "/usr/local/lib/python2.7/urllib2.py", line 513, in http_response
'http', request, response, code, msg, hdrs)
File "/usr/local/lib/python2.7/urllib2.py", line 438, in error
return self._call_chain(*args)
File "/usr/local/lib/python2.7/urllib2.py", line 372, in _call_chain
result = func(*args)
File "/usr/local/lib/python2.7/urllib2.py", line 521, in http_error_default
raise HTTPError(req.get_full_url(), code, msg, hdrs, fp)

person Madison May    schedule 12.07.2012    source источник
comment
Можете ли вы включить полную трассировку и исключение?   -  person girasquid    schedule 12.07.2012
comment
Конечно! Я должен был сделать это в первую очередь. ОБНОВЛЕНИЕ: добавлены трассировка и исключение.   -  person Madison May    schedule 12.07.2012


Ответы (1)


Похоже, это проблема с библиотекой фейсграфов — она отправляет запрос, который получает код состояния 400. Вы используете последнюю версию? Возможно ли, что что-то изменилось в API Facebook, что теперь вызывает проблемы с фейсграфом?

person girasquid    schedule 12.07.2012
comment
Я использую последнюю версию, поэтому не думаю, что это ошибка фейсграфа. Я думаю, что более вероятно, что я сделал что-то не так. Я с подозрением отношусь к строкам 166-167. Еще немного повозившись, я обнаружил, что access_token — это объект NoneType. Проблема в том, что я точно не знаю, почему. - person Madison May; 12.07.2012
comment
Пришло время проверить, что вам отправляет get_token(). :) - person girasquid; 12.07.2012
comment
get_token() — это функция, предоставляемая heroku. Вот суть: - person Madison May; 13.07.2012
comment
from urlparse import parse_qs r = requests.get('https://graph.facebook.com/oauth/access_token', params=params) token = parse_qs(r.content).get('access_token') return token Не совсем понял, как это форматировать, но идея понятна. - person Madison May; 13.07.2012
comment
Похоже, вы не получаете access_token обратно от Facebook — боюсь, я не работал с этим, поэтому больше ничем помочь не могу, но вы можете попробовать просмотреть документацию Facebook по oAuth и посмотреть, может ли быть все, что вы пропустили (возможно, ключ API или секрет). - person girasquid; 13.07.2012