如何将数据从Google App Engine(Python)传递到Flex 4应用程序

时间:2010-02-22 15:13:50

标签: python flex google-app-engine swfobject

我在app引擎中使用python和webapp框架用于后端,而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'];

但是,我收到空值。

请告知如何纠正它。感谢。

编辑:2月25日

感谢回答我问题的人。对于我的问题,我试图弄清楚python应用程序引擎在呈现包含swf文件的html文件时如何将数据传递给flex app。也许,我可以在main.py,swfobject.js或index.html中设置我的任务。

我知道如何使用Pyamf作为服务flex应用程序的网关,我正在考虑如何使应用程序更简单。

感谢。

编辑:2月28日

Robert,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 {身高:100%; }    身体{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; text-align:left;”);                                               

          要查看此页面,请确保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>  

谢谢,罗伯特。

编辑:3月7日

罗伯特,

请参阅http://help.adobe.com/en_US/Flex/4.0/html/WS2db454920e96a9e51e63e3d11c0bf626ae-7feb.html

在我发布问题之前,我尝试了以下代码:

在index.html中,

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

以及

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

结果,我得到:

&LT;用户

您知道为什么我无法获得正确的数据。感谢。

3 个答案:

答案 0 :(得分: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>

答案 1 :(得分:1)

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;}
}

并回调这两个函数:

ExternalInterface.addCallback("PassParameter", gethtmlparam);

希望它可以提供帮助。

答案 2 :(得分:1)

基于您对James Ward的回复的评论,我想知道您是否可以通过FlashVars param元素完成所需的工作?

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

您可能只需要调整index.html模板来构建FlashVars param元素。

编辑:3月6日

您可以尝试查看: http://polygeek.com/801_flex_reading-flashvars-in-flex

您需要确保等到应用程序加载后才能访问flashVars。

编辑:3月7日

正确,在这些例子中,他们硬编码值。您需要编辑模板,以便将值设置为模板参数的值。

所以,在index.html中: flashvars.userVO = "{{ userVO }}"