简体   繁体   中英

How to pass data from Google App Engine(Python) to Flex 4 application

I am using python and webapp framework in app engine for backend and flex 4 for front end. I would like to pass a string form backend to front end, so i write the following code in the 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))

And in the flex 4, I have the following code:

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

However, I receive null value.

Please advice how to correct it. Thanks.

Edit: 25 Feb.

Thanks for the people who answer my question. For my question, I am try to figure out how the python app engine pass data to flex app when it render the html file that include the swf file. Maybe, there is something I can set in the main.py, swfobject.js or the index.html to do my task.

I know how to use Pyamf as a gateway to serve the flex app, I am thinking how to make the app more simple.

Thanks.

Edit: 28 Feb.

Robert, the index.html is the standard file created by flash builder 4. Wish you can give me some hints how to modify it. The following is the file:

<!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; padding:0; overflow:hidden; text-align:center; }
#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;");

To view this page ensure that Adobe Flash Player version 10.0.0 or greater is installed.

获取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>  

Thanks, Robert.

Edit: 7 Mar.

Robert,

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

Before I post the question here, I tried the following code:

In the index.html,

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

and also

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

The result, I get:

< user

Do you know why I can't get the correct data. Thanks.

The best way to talk from Flex to GAE is using AMF. Here is how:

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 code (can be easily modified for 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>

What's in your index.html? You can pass the values to index.html, set a javascript function like:

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

Then set a function in Flex:

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

and call back these two function in :

ExternalInterface.addCallback("PassParameter", gethtmlparam);

Hope it can help.

Based on your comment to James Ward's response, I wonder if you can accomplish what you need with a FlashVars param element?

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

You will probably just need to adjust the index.html template to build the FlashVars param element.

Edit: 6 Mar

You might try looking at: http://polygeek.com/801_flex_reading-flashvars-in-flex

You need to be sure you wait until the app has been loaded to access the flashVars.

Edit: 7 Mar

Correct, in those examples they hard code the value. You need to edit your template so the value is set to the value of the template parameter.

So, in index.html: flashvars.userVO = "{{ userVO }}"

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM