普通 Flask-Restless 应用程序上的 HTTP 404 错误

Posted

技术标签:

【中文标题】普通 Flask-Restless 应用程序上的 HTTP 404 错误【英文标题】:HTTP 404 errors on trivial Flask-Restless app 【发布时间】:2013-04-09 10:55:24 【问题描述】:

我已经安装了Flask-Restless 并尝试运行quickstart app。所有请求都返回 404 错误(在 python 日志和 curl 响应中)。我的整个设置是:

$ virtualenv venv --distribute
$ source venv/bin/activate
$ pip install flask-restless
$ pip install flask-sqlalchemy # it doesn't appear to do this automatically
... Copy code from quickstart to "run.py" ...
$ python ./run.py

(another window)
$ curl -i http://127.0.0.1:5000/

run.py 的控制台输出是:

 * Running on http://127.0.0.1:5000/
 * Restarting with reloader
127.0.0.1 - - [16/Apr/2013 17:08:05] "GET / HTTP/1.1" 404 -

确实创建了test.db,使用调试器我可以看到app.run() 确实执行了。

有趣的是,我得到与Eve 完全相同的行为。不过,我可以运行简单的 Flask 应用程序。

如果重要的话,这是 OS X 10.8 和 Python 2.7.3。

【问题讨论】:

【参考方案1】:

来自 Flask-Restless documentation...

默认情况下,在上述代码示例中,Person 的 API 将是 可在http://<host>:<port>/api/person 访问,其中人员部分 URL 的值是Person.__tablename__:

我的猜测是,默认情况下,这些框架不会在路径/ 上设置端点。它们只为与 API 中的实际对象相关的路径定义了端点。试试下面的...

curl -i http://127.0.0.1:5000/api/person
curl -i http://127.0.0.1:5000/person

这些 URL 实际上可能会到达您定义的端点。

【讨论】:

特别是它原来是curl http://127.0.0.1:5000/api/person(这有点令人惊讶;我没有意识到它会小写它)。我曾假设根目录会给出某种 Django 风格的“这里是 API”。谢谢;这是一个真正的帮助。 Eve 的问题仍然存在,但这意味着这是 Eve 的问题,而不是我的常规设置。 在我研究文档时,小写字母来自 Flask-SQLAlchemy,它将 CamelCase 更改为 camel_case [Slight Unrelated] 当心 url_prefix 和 _tablename_ 我花了三个小时试图弄清楚这一点。如果你有一个 model Person 例如:person_blueprint = manager.create_api_blueprint(Person, methods=['GET', 'POST', 'DELETE'], url_prefix="/api") 你的 url 应该看起来像 http://localhost:5000/api/person 在我的例子中,我以这种方式创建了一个蓝图 person_blueprint = manager.create_api_blueprint(Person, methods=['GET', 'POST', 'DELETE'], url_prefix="/person") 错误的 url_prefix 给我带来了很多 404 痛苦.

以上是关于普通 Flask-Restless 应用程序上的 HTTP 404 错误的主要内容,如果未能解决你的问题,请参考以下文章

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

使用 Flask-Restless 配置 Flask-SQLAlchemy 以使用多个数据库

为 Flask-Restless API 序列化 Python 箭头对象

如何使用Flask-Restless启用CORS

带有mod_wsgi的flask-restless无法连接到MySQL服务器

无法导入 Flask-Restless