Как передать данные из Google App Engine(Python) в приложение Flex 4
Я использую 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 или выше.
<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 марта.
Роберт,
См. http://help.adobe.com/en_US/Flex/4.0/html/WS2db454920e96a9e51e63e3d11c0bf626ae-7feb.html
Прежде чем разместить вопрос здесь, я попробовал следующий код:
В index.html,
<%
String user = (String) request.getParameter("userVO");
%>
а также
flashvars.userVO = "<%= user %>";
В результате я получаю:
<пользователь
Вы знаете, почему я не могу получить правильные данные. Благодарю.
3 ответа
На основании вашего комментария к ответу Джеймса Уорда, мне интересно, сможете ли вы выполнить то, что вам нужно, с помощью элемента param FlashVars?
http://livedocs.adobe.com/flex/3/html/help.html?content=passingarguments_3.html
Вероятно, вам просто нужно настроить шаблон index.html для создания элемента param FlashVars.
Изменить: 6 марта
Вы можете попробовать посмотреть: http://polygeek.com/801_flex_reading-flashvars-in-flex
Вы должны быть уверены, что дождетесь загрузки приложения, чтобы получить доступ к flashVars.
Изменить: 7 марта
Правильно, в этих примерах они жестко кодируют значение. Вам нужно отредактировать ваш шаблон, чтобы в качестве значения было установлено значение параметра шаблона.
Итак, в index.html:flashvars.userVO = "{{ userVO }}"
Лучший способ общения от 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>
Что находится в вашем 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);
Надеюсь, это поможет.