Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/python-3.x/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 将application.py文件拆分为单独的文件_Python_Python 3.x_Flask - Fatal编程技术网

Python 将application.py文件拆分为单独的文件

Python 将application.py文件拆分为单独的文件,python,python-3.x,flask,Python,Python 3.x,Flask,我有一个问题,我在我的项目中创建了一个用于创建数据库的命令,我的问题是我想将它和其他类似的东西移动到不同的文件中,但是如果我尝试从不同的文件导入它们,我会得到一个导入错误,任何人都可以帮助我解决这个问题,谢谢。 这是我的application.py文件 import flask from database_website.extensions.database import db from database_website.properties import navigation_bar

我有一个问题,我在我的项目中创建了一个用于创建数据库的命令,我的问题是我想将它和其他类似的东西移动到不同的文件中,但是如果我尝试从不同的文件导入它们,我会得到一个导入错误,任何人都可以帮助我解决这个问题,谢谢。 这是我的application.py文件

import flask

from database_website.extensions.database import db
from database_website.properties import navigation_bar


class Application(flask.Flask):
    def load_configuration(self):
        self.config.from_pyfile('configuration.py')

    def configure_database(self):
        from database_website.extensions.database import db

        db.init_app(app=self)

    def configure_login_manager(self):
        from database_website.extensions.auth import login_manager

        login_manager.init_app(app=self)

    def register_applications(self):
        from database_website.applications.core.urls import blueprint as core_blueprint
        from database_website.applications.users.urls import blueprint as users_blueprint
        from database_website.applications.products.urls import blueprint as products_blueprint

        self.register_blueprint(blueprint=users_blueprint)
        self.register_blueprint(blueprint=products_blueprint)
        self.register_blueprint(blueprint=core_blueprint)

    @classmethod
    def create(cls):
        instance = Application(__name__)

        instance.load_configuration()
        instance.configure_database()
        instance.configure_login_manager()
        instance.register_applications()

        return instance


application = Application.create()


@application.cli.command()
def create_database():
    db.create_all()


def has_no_empty_params(rule):
    defaults = rule.defaults if rule.defaults is not None else ()
    arguments = rule.arguments if rule.arguments is not None else ()
    return len(defaults) >= len(arguments)


def sitemap():
    links = []
    for rule in application.url_map.iter_rules():
        # Filter out rules we can't navigate to in a browser
        # and rules that require parameters
        if "GET" in rule.methods and has_no_empty_params(rule):
            url = flask.url_for(rule.endpoint, **(rule.defaults or {}))
            links.append((url, rule.endpoint))
    return links


@application.context_processor
def inject_endpoints():
    return dict(endpoints=sitemap())


@application.context_processor
def inject_navigation():
    return dict(nav_bar=navigation_bar)


application.run()
我想移动的是注入和命令

编辑命令并将其移动到commands.py文件后,我的application.py文件

mport flask

from flask_migrate import Migrate

from database_website.extensions.database import db
from database_website.properties import navigation_bar
from database_website.commands import create_database


class Application(flask.Flask):
    def create_migrations(self):
        migrate = Migrate(self, db)

    def load_configuration(self):
        self.config.from_pyfile('configuration.py')

    def configure_database(self):
        from database_website.extensions.database import db

        db.init_app(app=self)

    def configure_login_manager(self):
        from database_website.extensions.auth import login_manager

        login_manager.init_app(app=self)

    def register_applications(self):
        from database_website.applications.core.urls import blueprint as core_blueprint
        from database_website.applications.users.urls import blueprint as users_blueprint
        from database_website.applications.products.urls import blueprint as products_blueprint

        self.register_blueprint(blueprint=users_blueprint)
        self.register_blueprint(blueprint=products_blueprint)
        self.register_blueprint(blueprint=core_blueprint)

    @classmethod
    def create(cls):
        instance = Application(__name__)

        instance.load_configuration()
        instance.configure_database()
        instance.configure_login_manager()
        instance.register_applications()
        instance.create_migrations()

        return instance


application = Application.create()


def has_no_empty_params(rule):
    defaults = rule.defaults if rule.defaults is not None else ()
    arguments = rule.arguments if rule.arguments is not None else ()
    return len(defaults) >= len(arguments)


def sitemap():
    links = []
    for rule in application.url_map.iter_rules():
        # Filter out rules we can't navigate to in a browser
        # and rules that require parameters
        if "GET" in rule.methods and has_no_empty_params(rule):
            url = flask.url_for(rule.endpoint, **(rule.defaults or {}))
            links.append((url, rule.endpoint))
    return links


@application.context_processor
def inject_endpoints():
    return dict(endpoints=sitemap())


@application.context_processor
def inject_navigation():
    return dict(nav_bar=navigation_bar)


application.run()
回溯:

Traceback (most recent call last):
  File "C:\Users\ulman\PycharmProjects\database_website_optimised\source\database_website\application.py", line 7, in <module>
    from database_website.commands import create_database
  File "C:\Users\ulman\PycharmProjects\database_website_optimised\source\database_website\commands.py", line 1, in <module>
    from database_website.application import application
  File "C:\Users\ulman\PycharmProjects\database_website_optimised\source\database_website\application.py", line 7, in <module>
    from database_website.commands import create_database
ImportError: cannot import name 'create_database' from 'database_website.commands' (C:\Users\ulman\PycharmProjects\database_website_optimised\source\database_website\commands.py)
回溯(最近一次呼叫最后一次):
文件“C:\Users\ulman\PycharmProjects\database\u website\u optimized\source\database\u website\application.py”,第7行,在
从database_website.commands导入创建数据库
文件“C:\Users\ulman\PycharmProjects\database\u website\u optimized\source\database\u website\commands.py”,第1行,在
从数据库_网站。应用程序导入应用程序
文件“C:\Users\ulman\PycharmProjects\database\u website\u optimized\source\database\u website\application.py”,第7行,在
从database_website.commands导入创建数据库
ImportError:无法从“database\u website.commands”(C:\Users\ulman\PycharmProjects\database\u website\u Optimized\source\database\u website\commands.py)导入名称“create\u database”
我将命令移到命令文件,然后将其导入应用程序文件。

编辑:

我自己还没有运行过这个,但是类似的东西应该会给你指出正确的方向。您应该能够注册您的命令蓝图,就像您已经注册的其他蓝图一样

commands.py

从flask导入蓝图
从数据库\u网站.extensions.database导入数据库
blueprint=blueprint('commands\u blueprint',\u\u name\u)
@命令\u blueprint.cli.command()
def create_数据库():
db.create_all()
applications.py

导入烧瓶
从数据库\u网站.extensions.database导入数据库
从database_website.properties导入导航栏
类别申请(烧瓶、烧瓶):
...
def寄存器应用程序(自身):
从database_website.applications.core.url导入蓝图作为核心蓝图
从数据库\u网站.applications.users.url导入蓝图作为用户\u蓝图
从数据库\网站.应用程序.产品.URL导入蓝图作为产品\蓝图
从数据库\u wensite.commands将blueprint作为命令\u blueprint导入
self.register\u blueprint(blueprint=users\u blueprint)
自我注册\u蓝图(蓝图=产品\u蓝图)
自我注册蓝图(蓝图=核心蓝图)
self.register\u blueprint(blueprint=commands\u blueprint)
...
您可以使用flask蓝图来帮助使代码更加模块化


我使用的是蓝图,但如果我理解正确,我可以在蓝图中使用cli命令?(但在我的例子中,创建数据库命令的问题并不特定于蓝图)重构后的代码是什么样子,会出现什么错误?将添加到我的编辑,编辑:添加到我的原始帖子,方法是简陋的,但如果不重新导入,它将不会被读取。你提到了蓝图,那么我可以为命令创建一个“命令”蓝图吗?或者也许有更好的方法更新我的答案,请尝试注册您的命令蓝图,就像您注册其他任何蓝图一样。注意:我不知道你的项目文件夹结构,所以请注意importsUpadte,在某个地方找到了我问题的答案,结果是我应该使用app\u context\u Processor