0

我正在尝试在烧瓶环境中实现我的 coursera python 项目。我还使用https://github.com/miguelgrinberg/flasky(分支 7a)来了解蓝图是如何工作的。现在,我定义了 2 个蓝图: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
4

1 回答 1

2

您从包中导入了rpls模块。rpls那是一个模块,而不是一个蓝图对象。

您不能将模块注册为蓝图;你只能注册flask.Blueprint()实例。您可能想了解Flask 蓝图的工作原理

您在包中既有一个rpls对象,又有一个子模块。导入模块时,它会替换文件中的实例;命名空间不是分开的。rplsapp.rpls.rplsrpls Blueprint__init__.py

重命名一个或另一个;模块或Blueprint对象。

于 2014-06-05T16:34:12.903 回答