python - 将 application.py 文件拆分为单独的文件
问题描述
我有一个问题,我在我的项目中创建了一个用于创建数据库的命令,我的问题是我想将它和其他类似的东西移动到单独的文件中,但是如果我尝试从不同的文件中导入它们,我会得到一个导入错误,谁能帮我解决这个问题,谢谢。这是我的 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)
我将命令移至命令文件,然后将其导入应用程序文件。
解决方案
编辑:
我自己没有运行过这个,但这样的事情应该会为你指明正确的方向。您应该能够像您已经注册的其他蓝图一样注册您的命令蓝图。
命令.py
from flask import Blueprint
from database_website.extensions.database import db
blueprint = Blueprint('commands_blueprint', __name__)
@commands_blueprint.cli.command()
def create_database():
db.create_all()
应用程序.py
import flask
from database_website.extensions.database import db
from database_website.properties import navigation_bar
class Application(flask.Flask):
...
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
from database_wensite.commands import blueprint as commands_blueprint
self.register_blueprint(blueprint=users_blueprint)
self.register_blueprint(blueprint=products_blueprint)
self.register_blueprint(blueprint=core_blueprint)
self.register_blueprint(blueprint=commands_blueprint)
...
您可以使用烧瓶蓝图来帮助您的代码更加模块化。
推荐阅读
- chatbot - 从 Watson 聊天机器人全屏播放视频
- php - 在 gitlab 中集成 phpdoc 用于自动生成文档
- python-2.7 - 如何在python中定义函数的子类型?
- python - 根据时间戳和不同位置创建会话
- c# - 具有延迟执行和 SQL 端分组的 EF Core Group By
- ios - 我应该在这里使用完成处理程序吗?如果是这样,如何最好地做到这一点?
- python - 部署到 Heroku 时找不到满足要求 anaconda-client==1.6.14 错误的版本
- ffmpeg - 从 IP 摄像机/rtsp 到网站的实时音频流
- typescript - 打字稿:推断基数的关键
- php - JQuery owlCarousel 插件不适用于简码