Как передать данные из Google App Engine (Python) в приложение Flex 4 - PullRequest
0 голосов
/ 22 февраля 2010

Я использую python и webapp framework в движке приложения для бэкэнда и flex 4 для фронтэнда. Я хотел бы передать бэкэнд строковой формы во внешний интерфейс, поэтому я пишу следующий код в main.py:

class MainPage(webapp.RequestHandler):

 def get(self):

  userVO = "test"

  template_values = {
   'url': self.request.uri,
   'userVO': userVO,

  }
  self.response.out.write(template.render("templates/index.html", template_values))

И в flex 4 у меня есть следующий код:

var user:String = FlexGlobals.topLevelApplication.parameters['userVO'];

Однако я получаю нулевое значение.

Пожалуйста, совет, как это исправить. Спасибо.

Редактировать: 25 февраля.

Спасибо за людей, которые отвечают на мой вопрос. На мой вопрос я попытаюсь выяснить, как движок приложения python передает данные в flex-приложение, когда оно отображает html-файл, содержащий swf-файл. Может быть, есть что-то, что я могу установить в main.py, swfobject.js или index.html для выполнения моей задачи.

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

Спасибо.

Редактировать: 28 февраля.

Роберт, index.html - это стандартный файл, созданный Flash Builder 4. Жаль, что вы можете дать мне несколько советов, как его изменить. Следующий файл:

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<!-- saved from url=(0014)about:internet -->  

<html xmlns="http://www.w3.org/1999/xhtml" lang="en" xml:lang="en"> 
<!-- 
Smart developers always View Source. 

This application was built using Adobe Flex, an open source framework
for building rich Internet applications that get delivered via the
Flash Player or to desktops via Adobe AIR. 

Learn more about Flex at http://flex.org 
// -->
   <head>
   <title></title>         
    <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" />

html, body {height: 100%; } body {margin: 0; обивка: 0; переполнение: скрытый; выравнивания текста: центр; }
#flashContent {display: none; }

    <script type="text/javascript" src="/js/swfobject.js"></script>
    <script type="text/javascript">
        <!-- For version detection, set to min. required Flash Player version, or 0 (or 0.0.0), for no version detection. --> 
        var swfVersionStr = "10.0.0";
        <!-- To use express install, set to playerProductInstall.swf, otherwise the empty string. -->
        var xiSwfUrlStr = "/swfs/playerProductInstall.swf";
        var flashvars = {};
        var params = {};
        params.quality = "high";
        params.bgcolor = "#ffffff";
        params.allowscriptaccess = "sameDomain";
        var attributes = {};
        attributes.id = "index";
        attributes.name = "index";
        attributes.align = "middle";
        swfobject.embedSWF(
            "/swfs/index.swf", "flashContent", 
            "100%", "100%", 
            swfVersionStr, xiSwfUrlStr, 
            flashvars, params, attributes);

swfobject.createCSS ("# flashContent", "display: block; выравнивание текста: слева;");

Для просмотра этой страницы убедитесь, что версия Adobe Flash Player 10.0.0 или выше установлен.

Get Adobe Flash Player
    
        
            
            
            
            
            <! - [if! IE]>
            
                
                
                
            <! [ENDIF] ->
            <! - [if gte IE 6]>
             
              Сценарии и активный контент запрещены к запуску, либо версия Adobe Flash Player
              10.0.0 или выше не установлен.
             
            <! [ENDIF] ->
                
                    
Get Adobe Flash Player <!--[if !IE]> <![endif]-->

Thanks, Robert.

Edit: 7 Mar.

Robert,

Refer to http://help.adobe.com/en_US/Flex/4.0/html/WS2db454920e96a9e51e63e3d11c0bf626ae-7feb.html

Прежде чем разместить вопрос здесь, я попробовал следующий код:

В index.html,

<%
     String user = (String) request.getParameter("userVO");
%>

а также

flashvars.userVO =  "<%= user %>"; 

Результат я получаю:

<пользователь </p>

Вы знаете, почему я не могу получить правильные данные. Спасибо.

Ответы [ 3 ]

2 голосов
/ 22 февраля 2010

Лучший способ общения от Flex до GAE - использование AMF. Вот как:

app.yaml

application: flexandthecloud
version: 3
runtime: python
api_version: 1

handlers:
- url: /services/.*
  script: main.py

main.py

#!/usr/bin/env python
import wsgiref.handlers

from pyamf.remoting.gateway.wsgi import WSGIGateway

def sayHello(name):
  return "howdy " + name

services = {
    'services.sayHello': sayHello
}

def main():
  application = WSGIGateway(services)
  wsgiref.handlers.CGIHandler().run(application)

if __name__ == '__main__':
  main()

Код Flex 3 (может быть легко изменен для Flex 4):

<?xml version="1.0" encoding="utf-8"?>
<mx:Application xmlns:mx="http://www.adobe.com/2006/mxml">

    <mx:RemoteObject id="ro" destination="services" endpoint="http://flexandthecloud.appspot.com/services/">
        <mx:result>
            l.text = event.result as String;
        </mx:result>
    </mx:RemoteObject>

    <mx:TextInput id="ti"/>
    <mx:Label id="l"/>
    <mx:Button label="say hello" click="ro.sayHello(ti.text)"/>

</mx:Application>
1 голос
/ 26 февраля 2010

Исходя из вашего комментария к ответу Джеймса Уорда, интересно, сможете ли вы выполнить то, что вам нужно, с помощью элемента параметра FlashVars?

http://livedocs.adobe.com/flex/3/html/help.html?content=passingarguments_3.html

Возможно, вам просто потребуется настроить шаблон index.html для создания элемента параметров FlashVars.

Редактировать: 6 марта

Вы можете попробовать посмотреть на: http://polygeek.com/801_flex_reading-flashvars-in-flex

Вы должны быть уверены, что дождетесь загрузки приложения, чтобы получить доступ к flashVars.

Редактировать: 7 марта

Правильно, в этих примерах они жестко кодируют значение. Вам необходимо отредактировать ваш шаблон, чтобы в качестве значения было указано значение параметра шаблона.

Итак, в index.html: flashvars.userVO = "{{ userVO }}"

1 голос
/ 25 февраля 2010

Что находится в вашем index.html?Вы можете передать значения в index.html, установить функцию JavaScript следующим образом:

function passvalue {
    PassParameter("userVO", "{{userVO}}");
}

Затем установить функцию в Flex:

public function gethtmlparam(name:String, val:String):void {
            switch (name) {
                case "userVO": userVO= val; break;}
}

и вызвать эти две функции в:1007 *

ExternalInterface.addCallback("PassParameter", gethtmlparam);

Надеюсь, что это поможет.

...