Flask-Restful 驱动的 API 返回 404 错误

3
我在一个项目中使用了Flask-Restful,同时也使用工厂模式来创建Flask对象。现在的问题是当我尝试访问http://localhost:5000/api/v1/user/时,Flask会给出404错误,但是当我查看(Flask应用程序对象的)url_map时,我的API规则是存在的。如果有人遇到过相同的问题,我正在寻找任何可能的解决方案。
以下是创建API应用程序的函数:
def create_app(settings_override=None):
    """
    Returns the API :class:`Flask` instance.

    :param settings_override: dictionary of settings to override.
    """
    app = factory.create_app(__name__, __path__, settings_override)
    api = Api(app, prefix='/api/v1', catch_all_404s=True)

    # API endpoints connected to the User model.
    api.add_resource(UserAPI, '/user/', endpoint='user')

    return app

用户API类的代码(由Flask-Restful使用):

class UserAPI(Resource):
    """
    API :class:`Resource` for returning the details of a user.
    This endpoint can be used to verify a user login credentials.
    """
    def get(self):
        return {'hello': 'world'}, 200

    def post(self):
        pass

factory.create_app函数:

def create_app(package_name, package_path, settings_override=None):
    """
    Returns an instance of Flask configured with common functionnalities for
    Cubbyhole.

    :param package_name: application package name
    :param package_path: application package path
    :param settings_override: a dictionnary of settings to override
    """
    app = Flask(package_name, instance_relative_config=True)

    app.config.from_object('cubbyhole.settings')
    app.config.from_pyfile('settings.cfg', silent=True)
    if settings_override is not None:
        app.config.update(settings_override)

    db.init_app(app)

    register_blueprints(app, package_name, package_path)

    return app

Python 2.7版本 Flask v. Flask-Restful版本


你的代码在我这里可以运行。使用的是最新版本的python 2.7flaskwerkzeugflask-restful。可能是你的环境或者factory.create_app出了问题。 - tbicr
谢谢您的关注,我使用了Flask(__name__)而不是factory.create_app进行了测试,结果也可以。现在我正在调试factory.create_app函数,但不知道问题可能来自哪里,因为该函数没有什么特别之处...(我已将该函数的代码添加到帖子中) - phndiaye
无法重现。我没有__path__变量,但可能是由于您的配置、数据库或蓝图初始化问题引起的。 - tbicr
1个回答

1

通过一些调查和在Flask的IRC频道上提出的一些问题,我发现当使用自定义域名时,端口号应该通过SERVER_NAME配置变量设置。因此,这个问题并不是源自工厂代码。

如果您想通过http://myserver.io:5000/访问服务器,则可以在SERVER_NAME中设置端口号(这里为5000),例如SERVER_NAME = myserver.io:5000

我的设置只做了这一个修改就解决了我的问题 :) 谢谢!


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接