2010-08-09 3 views
0

ОК Я программирую способ взаимодействия с Grooveshark (http://grooveshark.com). Сейчас у меня есть класс Grooveshark и несколько методов, один получает сеанс с сервером, другой получает токен, основанный на сеансе, а другой используется для создания вызовов api на сервере (и другие методы используют это). Сейчас я использую это как так .... Примечание использует витую и tidefer в витуюРазработка интерфейса для веб-сайтов api

g = Grooveshark() 
d = g.get_session() 
d.addCallback(lambda x: g.get_token()) 
## and then something like.... ## 
g.search("Song") 

Я нахожу это unpythonic и уродливое чувство даже после инициализации класса вы должны назвать два метода первого или еще другие методы не будет работать. Чтобы решить эту проблему, я пытаюсь получить ее так, чтобы метод, который создает вызовы api, заботится о сеансе и токене. В настоящее время эти два метода (методы сеанса и токена) устанавливают переменные класса и ничего не возвращают (ну нет). Поэтому мой вопрос: существует ли общий дизайн, используемый при взаимодействии с сайтами, требующими токенов и сеансов? Кроме того, маркер и сеанс извлекаются с сервера, так что я не могу иметь их запустить в методе инициализации (как это будет либо блок или не может быть сделано до того, как вызов апи сделан)

+0

Я думаю, что название вашего вопроса немного вводит в заблуждение. Я прочитал его и подумал, что вы разрабатываете пользовательский интерфейс для существующего api (что-то вроде api.jquery.com), а не для создания API. –

ответ

3

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

Если да, то почему бы не поставить get_session в категории __init__ вашего класса? Если это всегда должно выполняться раньше всего, это, казалось бы, имеет смысл. Конечно, это означает, что вызов класса будет еще возвращает еще неиспользуемый экземпляр - это неизбежно с асинхронным программированием на event-drive ... вы не блокируете, пока экземпляр не будет готов к использованию.

Одной из возможностей было бы передать обратный вызов для выполнения в качестве аргумента класса при его вызове; более Twisted-normal будет иметь функцию Grooveshark, которая возвращает отложенную (вы добавите к отложенному обратному вызову для выполнения и вызовите его с экземпляром в качестве аргумента, когда этот экземпляр, наконец, будет готов к использованию) ,

+0

Хорошо спасибо, так что в основном это асинхронная фабрика? Также get_session и get_token обращаются к серверу, поэтому они не являются функциями, которые я могу зависеть от того, что они выполняются с любой скоростью – Zimm3r

+0

@ Zimm3r, конечно, нет - поэтому я предлагаю либо упрощенный подход (который идет вразрез с зерном Twisted ;-) передачи обратного вызова непосредственно, когда вы вызываете класс, или, лучше, не вызываете класс, а фабричную функцию, которая возвращает отложенную (если это то, что вы подразумеваете под «асинхронной фабрикой», то это определенно один ;-) , –

+1

«Конечно, это означает, что вызов класса по-прежнему будет возвращать еще неиспользуемый экземпляр - это неизбежно с асинхронным программированием на event-drive ...» Не обязательно. Если вы хотите, чтобы настройка сеанса была прозрачной, вы можете сделать ее прозрачной. Тот факт, что другие методы (например, поиск) уже возвращают Отсрочку, означает, что вызывающий объект, вероятно, даже не заметит, должен ли результат ждать завершения настройки сеанса. Другими словами, поиск и другие методы должны просто ждать от get_session Deferred, которые либо они должны вызывать внутри, либо __init__ должны вызывать. –

0

Я бы очень рекомендовал посмотреть на Facebook graph API. Просто потому, что вам нужны сеансы, и некоторая аутентификация не означает, что вы можете создать чистый REST API. Facebook использует OAuth для обработки аутентификации, но есть и другие возможности.

Смежные вопросы