2016-01-12 29 views
0

我想這應該很簡單,但我認爲我錯過了一些東西。發佈到控制器中的URL不會觸發Flask中的render_template

簡單描述:我有一個列出特定單詞的頁面。每個單詞都有一個ID。我將這個ID傳遞給一個函數,然後將它發佈到一個URL。我試圖做的是傳遞ID,在後端查詢它,然後轉到帶查詢結果的編輯頁面。

這裏是我的代碼:

AngularJS功能

$scope.editDefinition = function (searchItem) { 
    var param = { id: searchItem.id }; 
    var url = "/table-based"; 
    $http.post(url, param).success(function (data) { 
     console.log(data); 
    }); 
    }; 

瓶/ Python的路由功能

@app.route("/table-based", methods=["GET", "POST"]) 
def edit_definition(): 
    if request.method == "POST": 
     j = json.loads(request.data) 
     uid = j["id"] 
     cdef = db.getDefinitionById(uid) 
     return render_template("edit.html", definition=cdef) 
    return render_template("edit.html") 

HTML

<div ng-init="init('{{ definition |tojson|safe }}')" ng-controller="editCtrl"> 
    <ng-include src="'/_partial_edit_form'"></ng-include> 
</div> 

EditCtrl具有相關的$scope.init函數來接收definition。基本上,它會返回一個包含edit.html模板的HTML的響應,但它不會重定向到該URL。

什麼給?

+1

爲什麼要重定向到URL?您所做的只是將響應記錄到控制檯。 –

回答

2

您尚未實現任何會導致瀏覽器重定向到新模板頁面的內容。在返回的數據中,您應該只看到render_template生成的html。

你有兩個選項,我可以看到。首先將cdef存儲在flask的g或會話對象中,然後使用角度$ route.reload()或$ window.location.reload()重新加載頁面,並讓燒瓶從GET或g上獲取cdef。

第二種選擇是重構你的代碼,這樣你就有角度做頁面渲染,然後你只需在POST上更新你的定義對象。在這種情況下,瓶子將返回json.dumps(cdef)而不是渲染模板,並且您將使用角模板來渲染它。

第二種選擇要好得多,而且幾乎正是Angular設計的目的。當我創建Angular-Flask應用程序時,我很少使用render_template,而是使用Angular在從基於容器的API中檢索數據爲JSON之後進行所有渲染。

+0

我想我理解了第二個選項,但是您能否提供一個基於上述代碼的示例代碼片段?我相信這應該使用'ngRoute',是嗎? – Manhattan

+0

我同意,一般情況下,最好有角度做所有的路由/位置變化。如果你想在一個傳統的應用程序中嵌入一個角度應用程序,那麼你可以執行一個'return redirect('some_other_view')',其中html是由瓶子渲染的。 – reptilicus

+0

+1並接受。我已將Flask更改爲RESTful API,並將所有路由保留給AngularJS,除了兩個實例:登錄和註銷,我仍然通過Flask/Jinja處理。如果可以的話,請看看我的另一個問題[這裏](http://stackoverflow.com/questions/34854696/)。謝謝。 – Manhattan