2011-03-24 133 views
3

我是一位新手程序員,在我的第一個Web應用程序(使用App Engine)上工作,請原諒我的無知。如何在Google App Engine上的頁面之間共享數據

我一直在修改Google給出的Hello World程序,試圖讓它做我想做的事。

在他們的演示(http://code.google.com/appengine/docs/python/gettingstarted/templates.html)中,他們有2個類創建2個頁面 - 其中一個是index.html,另一個是句柄通過將表單數據放入數據庫,然後重定向回主頁面,該頁面從數據庫加載信息。

我想在用戶提交一個字符串的主頁上有一個表單,在這個表單上執行各種操作,輸出顯示在主頁面上。

問題是,用戶提交的表單中的數據轉到表單處理頁面,我無法弄清楚如何將輸出返回到主頁面。

回答

5

使用Datastore來保持不同提交數據的自然方法是使用Datastore
如果爲了鍛鍊而不想使用數據存儲區,則必須將數據傳遞到視圖,並在每個Web請求之間使用一些hidden字段將其讀回。

讓我們來看看一個簡單的快速&髒例如:一個網頁應用程序,一個一個地求和整數。

application.py

import os 
from google.appengine.ext import webapp 
from google.appengine.ext.webapp import template 
from google.appengine.ext.webapp.util import run_wsgi_app 

class Sum(webapp.RequestHandler): 
    def get(self): 
     path = os.path.join(os.path.dirname(__file__), 'index.html') 
     template_values = {"total":0} 
     self.response.out.write(template.render(path, template_values)) 

    def post(self):  
     value = self.request.get("value") 
     total = self.request.get("total") 
     total = int(total) + int(value) 
     path = os.path.join(os.path.dirname(__file__), 'index.html') 
     template_values = {"value":value, 
          "total":total 
          } 
     self.response.out.write(template.render(path, template_values)) 

application = webapp.WSGIApplication(
           [('/', Sum), 
            ('/sum', Sum)], 
           debug=True) 

def main(): 
    run_wsgi_app(application) 

if __name__ == "__main__": 
    main() 

將數據傳遞到index.html視圖中,template.render函數用於使攜帶結果向視圖字典變量:

template.render(path_to_the_view, template_values) 

index.html

<html> 
<body> 
    <form action="/sum" method="post"> 
    <p> 
    <label for="value">Value to sum: 
    <input type="text" name="value"><br> 
    <input type="submit" value="Submit"> 
    <input type="hidden" name="total" value="{{ total }}"> 
    </p> 
    </form> 
    Last value submitted: {{ value }}| Total:{{ total }} 
</body> 
</html> 

index.html視圖使用字典鍵valuetotal來顯示結果並使用hidden字段將總數提交給控制器。

這裏是結果:

enter image description here

+0

啊!我有一些問題。 1.是否可以用兩個不同的類來做到這一點?我注意到你將兩個類組合成一個... 2.如果您使用數據存儲區跨類進行通信,那麼這將如何工作?看起來如果用戶A提交了一個值 - 比如說「3」並提交了它,那麼總和等於3,並且你會將它存儲在你的數據存儲中。然後,用戶B提交4,並且如預期的那樣,他將返回7,而不是4。你是否還需要爲每個用戶存儲一個唯一的ID? – Jeremy 2011-03-24 22:48:59

+0

@Jeremy 1)是的 - 它所處理的處理程序類並不重要。 2)這正是你已經看過的演示所做的。 – 2011-03-25 02:24:32

+0

@jeremy 1.您可以在滿足您的需求的幾個類中組織您的代碼;它並不重要。 2.如果你想在我的天真例子中使用數據存儲,是的,你應該區分每個用戶。 – systempuntoout 2011-03-25 08:09:29

1

index.html模板生成的HTML表單有以下form標籤:

<form action="/sign" method="post"> 

這意味着當用戶點擊提交按鈕表單的數據將被髮送到/signaction URL確定使用哪個處理程序。首先,我們來看看在你的app.yaml文件,看看哪個腳本將被用於處理請求:

handlers: 
- url: /.* 
    script: helloworld.py 

所有的URL由helloworld.py處理,所以讓我們來看看有:在此基礎上

application = webapp.WSGIApplication(
            [('/', MainPage), 
             ('/sign', Guestbook)], 
            debug=True) 

,我們可以看到/sign URL由Guestbook請求處理程序處理。如果您想要通過其他頁面處理表單提交,您可能需要更改提交表單的頁面(標籤form中的action屬性)或更改分配給指定的請求處理程序。

+0

對不起 - 我不是很清楚。我想要的是在主頁面上使用請求處理器的一些輸出的方法。這是可能的,或者我應該只是將用戶重定向到請求處理程序頁面(在這種情況下是/ sign)? – Jeremy 2011-03-24 15:35:21

+0

如果你應該在你的home和/ sign頁面上生成一些輸出,那麼你可能可以將它重構爲一個單獨的函數(兩個請求處理程序之外,或者作爲其中一個請求處理程序的靜態方法),並從兩個。或者也許你可以使用模板繼承來達到這個效果。取決於你想要做什麼。 – 2011-03-24 20:30:18

1

我不明白你爲什麼想讓輸出回到主頁面。在提交表單時,控件轉到處理程序類。現在,您可以以任何您想要的方式在您的requesthandler類中使用此表單數據。

如果您希望將一些數據從此請求處理程序傳輸到您的主頁,您可以創建全局變量或創建另一個帶隱藏輸入的表單來傳輸數據。希望這會回答你的問題。

+0

這正是我想要做的 - 抱歉太無知了,但我將如何創建一個全局變量並將其傳遞迴主頁類,或者創建一個隱藏輸入並將其傳回的窗體? – Jeremy 2011-03-24 15:31:48

+0

全局變量?說什麼? – 2011-03-25 02:23:28

+0

@Jeremy:請參閱創建全局變量,您需要在導入語句(如var1 = None)後定義它,並且在要使用它的任何函數中,必須將其定義爲全局變量1。希望這會解決你的問題。 – niteshb 2011-03-25 09:36:40

1

如果使用webapp.requestHandler,要求是一個字典對象,它包含了所有提交的用戶數據。所以,這裏是你如何獲取數據

class SubmitHandler (webapp.RequestHandler): 
    name = self.request.get ('name') 
    email = self.request.get ('emil') 
    # do whatever 

這假定「名」和「電子郵件」在你的表單字段。

0

我建議你使用一個Ajax的形式,這裏是幾個例子的鏈接(使用jquery) jquery ajax form handling

基本上你定義表單正如你通常所做的那樣,但不是將請求發送到另一個頁面,而是將請求發佈到服務器處理程序,該處理程序執行某些操作並通常以json格式傳回響應,然後可以使用JavaScript處理並使用JavaScript更新主頁面結果。