2008-09-10 3 views
12

Я пытаюсь реализовать AJAX в своем приложении Google App Engine, поэтому я ищу хорошую структуру AJAX, которая поможет мне. У кого-нибудь есть идея?Любая хорошая структура AJAX для приложений Google App Engine?

Я думаю о Google Web Toolkit, насколько он хорош в плане создания AJAX для Google App Engine?

ответ

12

Поскольку Google Web Toolkit является subset of Java, он лучше всего работает, когда вы также используете Java на бэкэнд. Поскольку Google App Engine в настоящее время Python only, я думаю, вам придется много потрудиться, чтобы заставить вашего сервера и клиента хорошо общаться друг с другом.

jQuery, кажется, самый популярный вариант библиотеки JavaScript в AJAX Tag at DjangoSnippets.com.

Редактировать: Вышеупомянутое относится только к приложениям Google App Engine, написанным на Python. Поскольку Google App Engine теперь поддерживает Java, GWT теперь может быть хорошим выбором для написания интерфейса AJAX. Google even have a tutorial showing you how to do it.

+2

http://code.google.com/webtoolkit/doc/latest/tutorial/appengine.html <- Новое место в приведенном выше учебнике. Жаль, что у меня не было репутации, чтобы отредактировать его. ;) – Drew 2010-01-04 22:34:12

+0

@Drew - обновил URL-адрес в ответе. Спасибо за головы. – 2010-01-05 05:03:23

3

Я бы порекомендовал вам взглянуть на чистую структуру javascript (возможно, JQuery) для вашего клиентского кода и написать JSON-сервисы на python, что, по-видимому, является самым простым и лучшим способом.

Google Web Toolkit позволяет писать пользовательский интерфейс на Java и компилировать его в javascript. Как говорит Дэйв, это может быть лучший выбор, где бэкэнд находится на Java, поскольку в этом случае у него хорошие крючки RPC.

1

jQuery - прекрасная библиотека, но также проверьте Prototype JavaScript framework. Это действительно превращает JavaScript в случайный неловкий язык на красивый и элегантный язык.

4

Нет причин, по которым вы не должны использовать GAE и Google Web Toolkit (GWT) вместе. Вы пишете свой внутренний код в Python и код интерфейса в Java (и, возможно, некоторый JavaScript), который затем скомпилируется в JavaScript. При использовании другой структуры AJAX у вас также будет такая разница между серверным и клиентским языками.

У GWT есть функции, которые упрощают удаленный вызов Java-кода на сервере, но это полностью необязательно. Вы можете просто использовать JSON или XML-интерфейсы, как и с другими структурами AJAX.

GWT 1.5 также включает в себя JavaScript Overlay Types, которые в основном позволяют рассматривать часть данных JSON как объект Java при разработке кода на стороне клиента. Вы можете узнать больше об этом here.

Update:

Теперь, когда Google была добавлена ​​поддержка Java для Google App Engine, вы можете развивать и серверной и во внешнем интерфейсе кода в Java на сытый Google стек - если вам нравится. Существует хороший Eclipse plugin от Google, который позволяет легко разрабатывать и развертывать приложения, которые используют GAE, GWT или оба.

0

В настоящее время я использую JQuery для своего приложения GAE, и он прекрасно работает для меня. У меня есть диаграмма (диаграммы Google), которая является динамической и использует вызов Ajax для захвата строки JSON. Кажется, что это отлично работает для меня.

2

Возможно, вы захотите посмотреть на Pajamas (http://pyjs.org/), который является «GWT для Python».

4

Вот как мы реализовали Ajax в Google App Engine, но эту идею можно обобщить на другие платформы.

У нас есть сценарий обработчика для запросов Ajax, который реагирует почти - с ответами JSON. Структура выглядит примерно так (это отрывок из стандартного сценария обработчика GAE):

def Get(self, user): 
    self.handleRequest() 

def Post(self, user): 
    self.handleRequest() 


def handleRequest(self):   
    ''' 
    A dictionary that maps an operation name to a command. 
    aka: a dispatcher map. 
    ''' 
    operationMap = {'getfriends':    [GetFriendsCommand], 
        'requestfriend':   [RequestFriendCommand, [self.request.get('id')]], 
        'confirmfriend':   [ConfirmFriendCommand, [self.request.get('id')]], 
        'ignorefriendrequest':  [IgnoreFriendRequestCommand, [self.request.get('id')]], 
        'deletefriend':    [DeleteFriendCommand, [self.request.get('id')]]} 

    # Delegate the request to the matching command class here. 

Команды представляют собой простую реализацию шаблона команды:

class Command(): 
    """ A simple command pattern. 
    """ 
    _valid = False 
    def validate(self): 
     """ Validates input. Sanitize user input here. 
     """ 
     self._valid = True 

    def _do_execute(self): 
     """ Executes the command. 
      Override this in subclasses. 
     """ 
     pass 

    @property 
    def valid(self): 
     return self._valid 

    def execute(self): 
     """ Override _do_execute rather than this. 
     """ 
     try: 
      self.validate() 
     except: 
      raise 
     return self._do_execute() 

    # Make it easy to invoke commands: 
    # So command() is equivalent to command.execute() 
    __call__ = execute 

На стороне клиента, мы создайте делегат Ajax. Prototype.js позволяет легко писать и понимать. Вот отрывок:

/** 
* Ajax API 
* 
* You should create a new instance for every call. 
*/ 
var AjaxAPI = Class.create({ 
    /* Service URL */ 
    url: HOME_PATH+"ajax/", 

    /* Function to call on results */ 
    resultCallback: null, 

    /* Function to call on faults. Implementation not shown */ 
    faultCallback: null, 

    /* Constructor/Initializer */ 
    initialize: function(resultCallback, faultCallback){ 
     this.resultCallback = resultCallback; 
     this.faultCallback = faultCallback; 
    }, 

    requestFriend: function(friendId){ 
     return new Ajax.Request(this.url + '?op=requestFriend', 
     {method: 'post', 
     parameters: {'id': friendId}, 
     onComplete: this.resultCallback 
     });  
    }, 

    getFriends: function(){ 
     return new Ajax.Request(this.url + '?op=getfriends', 
     {method: 'get', 
     onComplete: this.resultCallback 
     });  
    } 

}); 

вызывать делегат, вы сделать что-то вроде:

new AjaxApi(resultHandlerFunction, faultHandlerFunction).getFriends() 

Я надеюсь, что это помогает!

7

Хорошим способом является использование библиотеки AJAX, чтобы воспользоваться преимуществами Google's AJAX Libraries API service. Это немного быстрее и чище, чем загрузка JS и помещение его в вашу папку /static/ и не есть в квоте вашего диска.

В вашем JavaScript вы бы просто положить, например:

google.load("jquery", "1.3.2"); 

и/или

google.load(google.load("dojo", "1.3.0"); 

Где-то в вашем заголовке вы бы поставить что-то вроде:

<script src="http://www.google.com/jsapi?key=your-key-here"></script> 

И это все, что вам нужно, чтобы использовать библиотеки API Google.

0

Недавно Google анонсировала Java-версию Google App Engine. В этом выпуске также предусмотрен плагин Eclipse, который упрощает разработку приложений GAE с GWT.

Подробнее здесь: http://code.google.com/appengine/docs/java/overview.html

Конечно, это может потребовать от вас, чтобы переписать приложение в Java вместо питона, но, как кто-то, кто работал с GWT, позвольте мне сказать вам, преимущества использования современной IDE на вашей кодовой базе AJAX полностью стоит.

2

попробуйте также GQuery for GWT. Это Java-код:

public void onModuleLoad() { 
    $("div").css("color", "red").click(new Function() { 
     public void f(Element e) { 
      Window.alert("Hello"); 
      $(e).as(Effects).fadeOut(); 
     } 
    }); 
} 

код, Java в результате чего несколько дорогом времени компиляции (Java-> JavaScript) оптимизации и проще рефакторинг.

Ницца, это не так?

3

В моем блоге я имею дело с простым способом сделать это - ссылка: AJAX with Google App Engine. Включая все используемые javascript и код python.

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