我有两个文件rest_api.py
和Contact.py
。Contact与域对象(包含Contact
类)相似,而rest_api具有用于设置应用程序的功能。
在rest_api
我有以下几行:
from Contact import Contact
...
client = MongoClient('localhost',27017)
collection = client.crypto_database.test_collection
def dbcollection(){
return collection
}
...
api.add_resource(Contact,'/contact/<string:contact_id>')
在Contact
我尝试执行以下操作:
from rest_api import dbcollection
class Contact(Resource):
def get(self,contact_id):
result = {}
result['data'] = dbcollection.find_one({'contact_id':contact_id})
result['code'] = 200 if result['data'] else 404
return make_response(dumps(result), result['code'],{"Content-type": "application/json"})
失败并显示以下错误: ImportError: cannot import name Contact
导入联系人的正确方法是什么,以便它也可以使用rest_api中的变量/函数?
ps如果我将收集代码移动到另一个文件,然后导入该文件,则一切正常,但我认为还有其他方法。
这是循环导入依赖关系,因此无法解决。问题是,导入python模块确实会运行代码,该代码必须遵循一定的顺序,其中一个模块必须首先运行。
我要说的是,将支持代码保存在其他文件中是正确的方法。
但是,在这种情况下,dbcollection
导入时实际上并不需要。因此,您可以通过将模块级别的导入删除到get函数中来解决此问题。例如
class Contact(Resource):
def get(self,contact_id):
from rest_api import dbcollection
result = {}
result['data'] = dbcollection.find_one({'contact_id':contact_id})
result['code'] = 200 if result['data'] else 404
return make_response(dumps(result), result['code'],{"Content-type": "application/json"})
类似的方法如下:
import rest_api
class Contact(Resource):
def get(self,contact_id):
result = {}
result['data'] = rest_api.dbcollection.find_one({'contact_id':contact_id})
result['code'] = 200 if result['data'] else 404
return make_response(dumps(result), result['code'],{"Content-type": "application/json"})
这应该起作用,因为python做了一些努力来解决循环导入依赖关系:开始导入模块时,它将为该模块创建一个空模块字典。然后,当找到嵌套的导入时,将继续进行该导入。如果那又导入了一个已经在导入过程中的模块,它将跳过它。因此,在Contact.py
加载时,import rest_api
仅采用已经存在的模块字典。由于尚不包含dbcollection
,因此from rest_api import dbcollection
失败。import rest_api
但是,一个简单的方法确实可行,因为只有在Contact.py
完成导入后才寻址它的成员(除非您Contact.get
从内部调用模块级别)。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句