POST到控制器中的URL不会在Flask中触发render_template

时间:2016-01-12 10:31:59

标签: python angularjs flask

我想这应该很简单,但我想我错过了什么。

简单描述:我有一个列出特定单词的页面。每个单词都有一个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);
    });
  };

Flask / 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的响应,但不会重定向到该网址。

是什么给出了?

1 个答案:

答案 0 :(得分:2)

您尚未实施任何会导致浏览器重定向到新模板页面的内容。在返回的数据中,您应该只看到render_template生成的html。

我可以看到两个选项。第一种方法是将cdef存储在flask的g或session对象中,然后使用angular $ route.reload()或$ window.location.reload()重新加载页面,然后让烧瓶从g或者GET上的会话中获取cdef。

第二个选项是重构你的代码,以便你有角度进行页面渲染,然后你只需在POST上更新你的定义对象。在这种情况下,flask将返回json.dumps(cdef)而不是渲染模板,您将使用角度模板来渲染它。

第二种选择要好得多,而且几乎就是Angular的设计目标。当我创建Angular-Flask应用程序时,我很少使用render_template,而是在使用基于烧瓶的API从JSON检索数据后,让Angular完成所有渲染。