【问题标题】:KeyError: 'view_class' When trying to add a route using app.route and api.add_resource in flaskKeyError: 'view_class' 尝试在烧瓶中使用 app.route 和 api.add_resource 添加路由时
【发布时间】:2021-11-26 03:00:54
【问题描述】:

我有这个烧瓶项目,它使用 flask_restful 来创建和 API,还包括服务器端渲染。:

app.py

import os

from flask import Flask, render_template
from flask_restful import Api
from flask_migrate import Migrate

from ma import ma

from blacklist import BLACKLIST

from resources.test import Test



from db import db


# Init app

app = Flask(__name__,
            static_folder='static',
            template_folder='templates',
            )

# Init Api
api = Api(app)
# Init db
db.init_app(app)
# Init ma
ma.init_app(app)
# Init migrate
migrate = Migrate(app, db)


@app.route('/test')
def test():
    return "Hello World"

api.add_resource(Test, "/api/test/<string:test_id>")

if __name__ == "__main__":
    APP_RUN_HOST = os.environ.get("APP_RUN_HOST")
    app.run(APP_RUN_HOST, port=5000)

资源/test.py

from flask import request
from flask_restful import Resource, reqparse

from models.test import TestModel
from schemas.test import TestSchema

test_schema = TestSchema()


class Test(Resource):
    @classmethod
    # @jwt_required()
    def get(cls, test_id: int):
        test = TestModel.find_by_id(test_id)
        if test:
            return test_schema.dump(test), 200
        return {"message": gettext("test_test_not_found")}, 404

我也有schemas/test.pymodels/test.py

问题出在: 当我运行 python app.py 时,我看到了这个错误:

line 423, in _register_view
    previous_view_class = app.view_functions[endpoint].__dict__['view_class']
KeyError: 'view_class'

对此问题有任何修复或解释吗?该错误告诉我缺少密钥。并且应用程序崩溃了。

【问题讨论】:

    标签: python flask flask-restful


    【解决方案1】:

    我找到了问题的答案:

    对于每个 URL,都有一个端点是该 URL 路由的名称。

    flask术语中endpoint和url的区别:

    “端点”是路线的名称。端点名称是视图的注册键,这是一个符号名称,您可以通过它引用来自应用程序其他部分的路由。 Flask 本身将视图函数的名称假定为端点。

    @app.route('/')
    def index():
        pass
    

    等于:

    def index():
        pass
    app.add_url_rule('/', 'index', index)
    

    为了更好地理解它,并查看 url_map,可以这样做:

    更改 app.py 所在的目录。那么:

    - > flask shell
    - >>> from app import app
    - >>> app.url_map
    

    所以发生这种情况的原因是当我创建路线时

    @app.route('/test')
    def test():
        return "Hello World"
    

    一个名为 test 的端点添加到 URL 映射中: &lt;Rule '/test' (GET, HEAD, OPTIONS) -&gt; test&gt;

    当flask尝试在这一行创建test端点时

    api.add_resource(Test, "/api/test/&lt;string:test_id&gt;")

    它不能这样做,因为已经使用了同名的端点。 这就是为什么

    /api/test/&lt;string:test_id&gt;

    url_map 中缺少。

    解决此问题的方法是在路由中添加端点名称,如下所示:

    @app.route('/test', endpoint='test')
    def test():
        return "Hello World"
    
    api.add_resource(Test, "/api/test/<string:test_id>", endpoint='test-api')
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-01-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-11-09
      • 2014-03-07
      • 2013-02-04
      相关资源
      最近更新 更多