处理POST请求并使用AngularJS和Python Flask重定向

时间:2018-10-16 08:42:52

标签: python angularjs flask try-catch

我一直在使用 AngularJS Flask 进行一个简单的网站项目。在这家商店中,用户可以检查要购买的产品,下订单时,所有内容都保存在 postgresql 数据库中,并且用户被重定向到相应的页面(由于一些问题)。我正在使用 try-except 来处理存储过程中可能出现的错误,而且我无法设法将用户重定向到适当的url。将值插入数据库后,将不会发生任何事情。我在 main.html 中使用 ng-view

这是我的 server.py

@app.route('/')
def mainPage():
    return current_app.send_static_file('main.html')

@app.route('/shipping')
def shippingPage():
    return current_app.send_static_file('main.html')

@app.route('/shippingfailed')
def shippingFailedPage():
    return current_app.send_static_file('main.html')

@app.route('/placeorder', methods=['GET','POST'])
def placeOrder():
    try:
        data = request.get_json()
        productsBought = data.pop('products')

        order = orders(**data)
        session.add(order)
        session.flush()

        mydict = {}
        mydict["orderno"] = order.orderno
        for product in productsBought:
            mydict["productno"] = product
            details = orderdetails(**mydict)
            session.add(details)
            session.flush()

        session.commit()
        return redirect(url_for('shippingPage'))

    except Exception:
        session.rollback()
        raise
        return redirect(url_for('shippingFailedPage'))

    finally:
        session.close()

这是我的 app.js

angular.module('shoppingCart', ['ngRoute'])
.config(['$routeProvider', '$locationProvider',
        function($routeProvider, $locationProvider) {
  $locationProvider.hashPrefix('');
  $routeProvider
  .when('/', {
    templateUrl: 'static/cart.html'
  })
  .when('/cart', {
    templateUrl: 'static/cart.html'
  })
  .when('/checkout', {
    templateUrl: 'static/checkout.html'
  })
  .when('/shipping', {
    templateUrl: 'static/shipping.html'
  })
  .when('/shippingfailed', {
    templateUrl: 'static/shippingfailed.html'
  });
}])
.controller('cartCtrl', ['$scope', '$http', '$filter', function($scope, $http, $filter){
this.placeOrder = function(){
    vm.customer.price = $filter('calculateTotal')(this.cartItems);
    this.jsonCustomer = JSON.stringify(vm.customer);
    $http.post('/placeorder', this.jsonCustomer, {headers: {'Content-Type': 'application/json'} });
  }
}])

这是我的 checkout.html

  <div class="text-right">
    <a type="button"
       class="btn btn-danger"
       ng-if="vm.cartItems.length !=0"
       ng-click="vm.placeOrder()"
       href="#/placeorder">Place Order</a>
  </div>

因此,总而言之,预期的行为是当用户使用 checkout.html 并单击 Place Order 时,他们被重定向到 / placeorder ,然后服务器在try-except内部处理POST请求,并根据该请求进行重定向。

1 个答案:

答案 0 :(得分:0)

您不应在flask的API端点中返回重定向。而是返回一个URL以进行重定向,然后检查POST的结果并在前端应用程序中进行重定向。