AttributeError: "'NoneType'对象没有'path'属性"在<function _remove at 0x10c49a668>中被忽略

0 投票
1 回答
8439 浏览
提问于 2025-04-18 08:45

我正在尝试在Flask环境中实现我的Coursera Python项目。同时,我也在使用https://github.com/miguelgrinberg/flasky(7a分支)来理解蓝图是怎么工作的。现在,我定义了两个蓝图:main_blueprint和rpsls_blueprint。在运行应用程序后,我遇到了以下错误:

Traceback (most recent call last):
  File "manage.py", line 8, in <module>
    app = create_app(os.getenv('FLASK_CONFIG') or 'default')
  File "..../app/__init__.py", line 29, in create_app
    app.register_blueprint(rpsls_blueprint)
  File "/Library/Python/2.7/site-packages/flask/app.py", line 62, in wrapper_func
    return f(self, *args, **kwargs)
  File "/Library/Python/2.7/site-packages/flask/app.py", line 880, in register_blueprint
    if blueprint.name in self.blueprints:
AttributeError: 'module' object has no attribute 'name'
Exception AttributeError: "'NoneType' object has no attribute 'path'" in <function _remove at 0x10c49a668> ignored

有人知道问题出在哪里吗?以下是我app/__init__.py文件中相关的部分:

def create_app(config_name):
    app = Flask(__name__)
    app.config.from_object(config[config_name])
    config[config_name].init_app(app)

    bootstrap.init_app(app)
    mail.init_app(app)
    moment.init_app(app)
    db.init_app(app)

    from .main import main as main_blueprint
    app.register_blueprint(main_blueprint)

    from .rpsls import rpsls as rpsls_blueprint
    app.register_blueprint(rpsls_blueprint)

    return app

这是我的app/rpsls/rpsls.py文件:

import random

class RpslsGame():
    def __init__(self):
        pass

    def name_to_number(self, name):
        if name == "rock":
            return 0
        elif name == "Spock":
            return 1
        elif name == "paper":
            return 2
        elif name == "lizard":
            return 3
        elif name == "scissors":
            return 4
        else:
            return name + " does not match any\
                            of the five correct input strings"

    def number_to_name(self, number):
        if number == 0:
            return "rock"
        elif number == 1:
            return "Spock"
        elif number == 2:
            return "paper"
        elif number == 3:
            return "lizard"
        elif number == 4:
            return "scissors"
        else:
            return str(number) + \
                "  is not in the correct range"

    def rpslsMethod(self, player_choice):
        result = ""
        result += "Player chooses " + str(player_choice) + "\n"
        player_number = self.name_to_number(player_choice)
        comp_number = random.randrange(0, 5)
        comp_choice = self.number_to_name(comp_number)
        result += "Computer chooses " + comp_choice + "\n"
        differene = (comp_number - player_number) % 5
        if (differene == 1 or differene == 2):
            result += "Computer wins\n"
        elif (differene == 3 or differene == 4):
            result += "Player wins\n"
        elif (differene == 0):
            result += "Try again, It's a tie\n"

        return result

我的app/rpsls/init.py文件:

from flask import Blueprint
rpsls = Blueprint('rpsls', __name__)
from . import views

1 个回答

2

你从 rpls 包里导入了 rpls 模块。这个是一个 模块,而不是蓝图对象。

你不能把一个模块注册为蓝图;你只能注册 flask.Blueprint() 实例。你可能需要了解一下 Flask 蓝图是怎么工作的

你在 rpls 包里有一个 rpls 对象,还有一个子模块。当你导入 app.rpls.rpls 模块时,它会 替换掉__init__.py 文件里的 rpls Blueprint 实例;它们的命名空间是相互关联的。

你需要把其中一个重命名;可以是模块或者 Blueprint 对象。

撰写回答