【问题标题】:Flask-Restful routes showing 404Flask-Restful 路由显示 404
【发布时间】:2022-10-24 04:35:07
【问题描述】:

我遇到了一个问题,在我的 Flask-Restful 应用程序中,当我尝试导航时,所有路线都显示 404 not found。例如http://localhost:5000/api/v1/auth/login

在我的应用程序中,所有路线都定义得很好,但由于某些不清楚的原因,所有路线都显示 404。 在寻找这个问题的答案时,我遇到了这个问题Flask-Restful powered API returning 404 errors,但它对我的问题没有答案。我不知道为什么会这样

这是我配置所有内容的方式。 入口文件 app.py

from api import create_app, db, jwt
from flask_script import Manager
from flask_migrate import MigrateCommand


app = create_app()

manager = Manager(app)
manager.add_command('db', MigrateCommand)

if __name__ == '__main__':
    db.create_all(app=create_app())
    app.run()

__init__.py in auth folder

from .resources import UserLogin, LogoutAccess, TokenRefresh, LogoutRefresh, RegisterUser

def auth_routes(api):
    api.add_resource(UserLogin, '/auth/login')
    api.add_resource(RegisterUser, '/auth/register')
    api.add_resource(LogoutAccess, '/auth/logout')
    api.add_resource(TokenRefresh, '/auth/refresh')
    api.add_resource(LogoutRefresh, '/auth/logout/refresh')

__init__.py in api folder

from sqlalchemy import MetaData
from flask import Flask, jsonify
from flask_sqlalchemy import SQLAlchemy
from flask_restful import Api
from flask_jwt_extended import JWTManager
from flask_marshmallow import Marshmallow
from .config import env_config
from flask_migrate import Migrate
from flask_cors import CORS
import logging

convention = {
    "ix": 'ix_%(column_0_label)s',
    "uq": "uq_%(table_name)s_%(column_0_name)s",
    "ck": "ck_%(table_name)s_%(constraint_name)s",
    "fk": "fk_%(table_name)s_%(column_0_name)s_%(referred_table_name)s",
    "pk": "pk_%(table_name)s"
}

metadata = MetaData(naming_convention=convention)

db = SQLAlchemy(metadata=metadata)
migrate = Migrate()
ma = Marshmallow()
api = Api()
jwt = JWTManager()
cors = CORS()

logging.basicConfig(filename='app.log', level=logging.DEBUG, format='%(asctime)s %(message)s', datefmt='%m/%d/%Y %I:%M:%S %p')

def create_app(config_name='testing'):
    app = Flask(__name__)
    app.config.from_object(env_config[config_name])
    db.init_app(app)
    migrate.init_app(app, db)
    ma.init_app(app)
    api.init_app(app)
    jwt.init_app(app)
    cors.init_app(app)
    api.prefix = '/api/v1'
    
    from .errors.handlers import errors
    app.register_blueprint(errors)

    from models import RevokedToken

    @jwt.token_in_blacklist_loader
    def check_if_token_in_blacklist(decrypted_token):
        jti = decrypted_token['jti']
        return RevokedToken.is_jti_blacklisted(jti)

    
    @jwt.user_claims_loader
    def add_claims_to_access_token(identity):
        return {
            'id': identity.id,
            'role': identity.role
        }

    @jwt.user_identity_loader
    def user_identity_lookup(user):
        return user.id

    from .auth import auth_routes
    from .parcels import parcel_routes

    auth_routes(api)
    parcel_routes(api)

        
    return app

我正在使用 python 3.9、Flask 1.12、Flask-RestFul 0.3.8

【问题讨论】:

  • 我可以想象 api.prefix = '/api/v1' 实际上不起作用,您是否尝试在不带前缀的情况下调用 /api/auth/login 并检查是否得到响应?
  • 你应该看看blueprints。您通常创建一个带有前缀的蓝图,而不是api.prefix,并在该蓝图中注册路由,而不是直接在api 上注册。最后,在api 中注册蓝图。
  • @c8999c3f964f64 我去掉了前缀,还是一样

标签: python flask flask-restful


【解决方案1】:

如果您使用的是应用工厂,则需要在调用api.init_app(app) 之前添加资源。

所以:

  1. api = Api()
  2. auth_routes(api)
  3. api.init_app(app)

    那应该像刚才对我一样。此外,对于其他研究此问题的人,您可以通过以下方式查看应用程序中的当前路线:

    在烧瓶壳中:from flask import current_app 并运行 current_app.map

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-09-04
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多