使用 Flask-Restless 进行 GAE app.yaml 路由

Posted

技术标签:

【中文标题】使用 Flask-Restless 进行 GAE app.yaml 路由【英文标题】:GAE app.yaml routing with Flask-Restless 【发布时间】:2015-09-20 09:15:38 【问题描述】:

我正在开发一个带有 AngularJS 前端 + GAE 后端(Python 和 Flask)的应用程序。我在设置 app.yaml 以路由使用 Flask-Restless 扩展创建的 API 端点时遇到了麻烦。我的 app.yaml 文件如下所示:

application: myAppID
version: 1
runtime: python27
threadsafe: true
api_version: 1

handlers:
# handler 1
- url: /favicon\.ico
  static_files: favicon.ico
  upload: favicon\.ico

# handler 2
- url: /api/.*
  script: main.app

# handler 3
- url: /test
  script: main.app

# handler 4
- url: (.*)/
  static_files: app\1/index.html
  upload: app #this is the frontend folder for Angular

# handler 5
- url: (.*)
  static_files: app\1
  upload: app #this is the frontend folder for Angular

在 Angular 中,路由配置如下所示:

App.config(['$stateProvider', '$locationProvider', '$urlRouterProvider', 'RouteHelpersProvider',
function ($stateProvider, $locationProvider, $urlRouterProvider, helper) 
  'use strict';

  $locationProvider.html5Mode(false);

  // default route
  $urlRouterProvider.otherwise('/app/dashboard');

  // other routes ...
]);

main.py 文件如下所示:

from flask import Flask
import os
from werkzeug import debug
from flask import jsonify
from google.appengine.ext.webapp.util import run_wsgi_app

app = Flask('myApp')

if os.getenv('SERVER_SOFTWARE') and os.getenv('SERVER_SOFTWARE').startswith('Google App Engine/'):
    app.debug = False
else:
    app.debug = True

if app.debug:
    app.wsgi_app = debug.DebuggedApplication(app.wsgi_app, True)

@app.route('/test')
def test():
    return jsonify(test="json": "test")

import models

run_wsgi_app(app)

models 是包含 Flask-SQLAlchemy 模型和 Flask-Restless 端点的文件。

Angular 部分加载正确,例如这个 URL 工作正常:

A) http://localhost:8080/#/app/dashboard

但 GAE 后端部分会针对以下 URL 响应 500 错误:

B) http://localhost:8080/api/person C) http://localhost:8080/test

如果我删除 handler 4handler 5,则 BC URL 工作正常,但 Angular 前端停止工作。

我做错了什么?

【问题讨论】:

Angular route not working when used with Google App Engine and Flask的可能重复 【参考方案1】:

我在旅途中,所以用我的手机写作不是那么有趣...

无论如何,我在我的应用程序中所做的是我只有一个触发烧瓶应用程序的处理程序。

在烧瓶应用程序中, / 路由通常会将 Angular Web 应用程序作为静态文件返回。

您需要配置您的 Flask 应用程序,它会知道静态(HTML、JS 等)文件夹。

已编辑:

app.yaml 应该如下所示:

handlers:
- url: .*  # This regex directs all routes to main.app
   script: main.app

main.app 是烧瓶应用程序.. 现在让我们看看如何从路线“/”提供角度应用程序

from flask import Flask, render_template
app = Flask(__name__, static_folder='/templates') # This sets /templates to be the folder for all JS HTML CSS files

@app.route('/')
def wellcomePage():
    return app.send_static_file('index.html')

您的 app.js 文件中的角度路由配置:

app.config(['$routeProvider', '$locationProvider',
function($routeProvider, $locationProvider) 
    $routeProvider
        .when('/', 
            templateUrl: 'templates/views/home.html'
        ).... Some More Routes..

注意 templateUrl: 'templates/...'

请看看我的应用程序。我想它会帮助你理解我在这里想说的话......

SE Hub at github

当我拿到一个该死的键盘时,我会编辑这个答案:)

如果这有帮助,请告诉我。

【讨论】:

天哪!你真的救了我。我仅用于开发目的:return make_response(open('app/index.html').read()) 而不是this answer 中提到的app.send_static_file('index.html') 如何将静态文件上传到 GAE?,当我部署时不起作用:( 究竟是什么不起作用?您是否使用 CL 进行部署,如果是,使用什么命令?你有任何错误吗? 我在 Windows 上使用 GAE 启动器,它有一个部署按钮,可以完成所有工作,没有显示错误并且部署成功。但是当我尝试访问 myapp.appspot.com 时,我收到 500 服务器错误。我猜我的 app/index.html 文件没有找到。 感谢@Sagi Dayan,我不知道 GAE 日志,它们非常有用!错误是我需要在app.yamlmodule 中导入mysqldb,以便使用'mysql+mysqldb://username@/database?unix_socket=/cloudsql/projectID:instanceID' 之类的URI 使用Flask-SQLAlchemy 连接到CloudSQL 实例。当我在 localhost 服务器中时,连接 URI 是 mysql://username:password@localhost/database 并且不需要 MySqldb。

以上是关于使用 Flask-Restless 进行 GAE app.yaml 路由的主要内容,如果未能解决你的问题,请参考以下文章

Flask-Restless 不区分大小写的查询

flask-restless 限制 RESTful api 访问

使用 flask-restless 对 POST 的错误请求与关系

使用flask-restless实现超媒体

如何使用 Flask-Restless 启用 CORS

使用 flask-restless 创建 API 响应