2010-02-22 2 views
0

Я использую фреймворк python и webapp в движке приложения для backend и flex 4 для интерфейса. Я хотел бы передать строку формы бэкенд к переднему концу, поэтому я пишу следующий код в main.py:Как передать данные из приложения Google App Engine (Python) в приложение Flex 4

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']; 

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

Прошу совета, как исправить. Благодарю.

Edit: 25 февраля

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

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

Спасибо.

Edit: 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, тело {высота: 100%; } тело {margin: 0; обивка: 0; переполнение: скрытый; выравнивания текста: центр; }
#flashContent {дисплей: нет; }

<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", "дисплей: блок; выравнивания текста: слева;");

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

Get Adobe Flash Player

<noscript> 
     <object classid="clsid:D27CDB6E-AE6D-11cf-96B8-444553540000" width="100%" height="100%" id="index"> 
      <param name="movie" value="index.swf" /> 
      <param name="quality" value="high" /> 
      <param name="bgcolor" value="#ffffff" /> 
      <param name="allowScriptAccess" value="sameDomain" /> 
      <!--[if !IE]> 
      <object type="application/x-shockwave-flash" data="index.swf" width="100%" height="100%"> 
       <param name="quality" value="high" /> 
       <param name="bgcolor" value="#ffffff" /> 
       <param name="allowScriptAccess" value="sameDomain" /> 
      <![endif]--> 
      <!--[if gte IE 6]> 
      <p> 
       Either scripts and active content are not permitted to run or Adobe Flash Player version 
       10.0.0 or greater is not installed. 
      </p> 
      <![endif]--> 
       <a href="http://www.adobe.com/go/getflashplayer"> 
        <img src="https://www.adobe.com/images/shared/download_buttons/get_flash_player.gif" alt="Get Adobe Flash Player" /> 
       </a> 
      <!--[if !IE]> 
      </object> 
      <![endif]--> 
     </object> 
</noscript> 

Спасибо, Роберт.

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

Роберт,

См http://help.adobe.com/en_US/Flex/4.0/html/WS2db454920e96a9e51e63e3d11c0bf626ae-7feb.html

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

В index.html,

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

, а также

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

В результате, я получаю:

< пользователь

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

ответ

1

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

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

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

Edit: 6 марта

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

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

Edit: 7 марта

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

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

+0

Спасибо, Роберт, я знаю, что могу настроить Flashvars для выполнения задачи, и я пробовал ее много раз. Но это не успех. Для liveocs, как flex 3, так и 4, я уже читал это несколько раз. – michael

+0

Можете ли вы разместить содержимое своего шаблона index.html? –

+0

Роберт, я размещаю файл в вопросе. – michael

2

Лучший способ поговорить от 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> 
+0

Спасибо Джеймс. На самом деле, я использую pyamf для шлюза. Я пытаюсь передать некоторые данные в приложение flex, когда html renedered, так что мне не нужно вызывать какую-либо службу, и я могу получить некоторые данные. – michael

+0

Я бы просто использовал приложение ApplicationComplete в приложении, которое вызовет сервис и загрузит данные. –

+0

Да, вы можете, но вам нужно еще раз подключить движок приложения. Это увеличит накладные расходы. – michael

1

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

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

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

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

и перезвонить эти две функции в:

ExternalInterface.addCallback("PassParameter", gethtmlparam); 

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

+0

mal39, спасибо за ваш ответ. Это хорошая попытка. Тем не менее, я тестирую, как сервер приложений python передает данные в приложение flex через swfobject. Может быть, мой вопрос недостаточно ясен. Для index.html это стандартный файл, сгенерированный Flash Builder автоматически. В любом случае, спасибо за ваше предложение. – michael