【问题标题】:How to resolve the problem with a circular import using python如何使用python解决循环导入的问题
【发布时间】:2021-08-30 16:30:33
【问题描述】:

我正在学习如何使用flask-restful 和jwt 在python 中创建restful api,现在我遇到了导入问题。这是错误和我的源代码 错误: py .\api.py

回溯(最近一次通话最后一次): 文件“C:\Users\Amoungui\Documents\Projects\API-playlist-master\api.py”,第 4 行,在 从应用程序导入应用程序,api 文件“C:\Users\Amoungui\Documents\Projects\API-playlist-master\app.py”,第 4 行,在 从安全导入身份验证,身份 文件“C:\Users\Amoungui\Documents\Projects\API-playlist-master\security.py”,第 1 行,在 从用户导入用户 文件“C:\Users\Amoungui\Documents\Projects\API-playlist-master\User.py”,第 1 行,在 从应用程序导入数据库 ImportError:无法从部分初始化的模块“app”导入名称“db”(很可能是由于循环导入)(C:\Users\Amoungui\Documents\Projects\API-playlist-master\app.py)

这是文件代码 index.py:

from flask import request
from flask_restful import Resource
from flask_jwt import jwt_required
from app import app, api
from CustomerRepository import CustomerRepository as Repository

items = Repository.findAll()

class UserController(Resource):
    @jwt_required()
    def get(self, id):
        item = next(filter(lambda x: x['id'] == id, items), None)
        return {'item': item}, 200 if item else 404
    
    def post(self):
        data = request.get_json()
        new_item = {'tel': data['tel'],'password':data['password']}
        items.append(new_item)
        return new_item
    
    def delete(self, id):
        global items
        items = list(filter(lambda x:x['name']!=id,items))
        return items

    def put(self, id):
        data = request.get_json()
        item = next(filter(lambda x:x['id'] == id, items),None)
        if item is None:
            item = {'tel':data['tel'], 'password':data['password']}
            items.append(item)
        else:
            item.update(data)

class ItemList(Resource):
    def get(self):
        return{'item':items}

api.add_resource(UserController,'/items/<string:name>')
api.add_resource(ItemList,'/items')


app.run(port=4000,debug=True)

我拥有所有配置的 app.py

from flask import Flask
from flask_mongoengine import MongoEngine
from flask_restful import Api
from security import auth,identity
from flask_jwt import JWT
import urllib

app = Flask(__name__)

database_name = "API"
mongodb_password = ""
DB_URI = "mongodb+srv://m001-student:"+ urllib.parse.quote(mongodb_password) +"@cluster0.hr17o.mongodb.net/{}?retryWrites=true&w=majority".format(database_name)
app.config['MONGODB_HOST'] = DB_URI

app.secret_key = '#0#'
api = Api(app)
jwt = JWT(app, auth, identity)#/auth

db = MongoEngine()
db.init_app(app)

CustomerRepository.py

from flask import make_response, request, jsonify
from User import User

class CustomerRepository():
    
    def findAll():
        users = []
        for user in User.objects:
            users.append(user)
            
        return make_response(jsonify(users), 200)

用户.py:

from app import db

class User(db.Document):
    customer_id = db.IntField()
    tel = db.StringField()
    password = db.IntField(6)
    
    def to_json(self):
        return {
            "customer_id": self.customer_id,
            "tel": self.tel,
            "password": self.password,
        }

security.py

from User import User
from werkzeug.security import safe_str_cmp

def auth(tel,password):
    user = User.findByName(tel)
    if user and safe_str_cmp(user.password,password):
        return user

def identity(payload):
    id = payload['identity']
    return User.find_by_id(id)

def findByName(number):
    customer_obj = User.objects(tel=number).first()
    if customer_obj:
        return customer_obj

def findById(customer_id):
    customer_obj = User.objects(customer_id=customer_id).first()
    if customer_obj:
        return customer_obj

提前感谢您的帮助

【问题讨论】:

    标签: python-3.x flask


    【解决方案1】:

    我可以看到您在index.py 中有api.add_resource(UserController,'/items/&lt;string:name&gt;')。但我没有看到 api 被定义或从任何地方导入。你可以从那里开始。

    【讨论】:

    • 这是一个循环导入错误。有这样的错误是很常见的。不要导入应用程序,请尝试current_appfrom flask import current_app 并在任何地方使用 current_app 而不是 app。这应该可以解决循环依赖问题。
    • 我将应用程序移到索引文件和应用程序文件中并用current_app替换它但没有结果。我有同样的错误
    • 你能把你的代码贴在这里看看你是如何修复这个错误的吗?
    【解决方案2】:

    我尝试了一种新方法,效果很好 应用程序.py

    from flask import Flask
    
    app = Flask(__name__)
    

    index.py

    from flask import Flask, jsonify, request
    from flask_restful import Resource
    from Customer import Customer
    
    class HelloWorld(Resource): 
    
        def get(self):
            return Customer.findAll(Customer)
        
        def post(self):
            data = request.get_json()
            
            customer = Customer(
                        tel=data['tel'], 
                        password=data['password']
                    )
            customer.save()     
        
    class Multi(Resource):
        def get(self, num):
            return {'result': num*10}
    

    客户.py

    from flask import jsonify, make_response
    from mongoose import db
    
    class Customer(db.Document):
        customer_id = db.IntField()
        tel = db.StringField()
        password = db.IntField(6)
        
        def to_json(self):
            return {
                "customer_id": self.customer_id,
                "tel": self.tel,
                "password": self.password,
            }
    
        def findAll(self):
            users = []
            for user in self.objects:
                users.append(user)
                
            return make_response(jsonify(users), 200)
    

    routes.py

    from index import HelloWorld, Multi
    from flask_restful import Api
    from app import app
    api = Api(app)
    
    api.add_resource(HelloWorld, '/')
    api.add_resource(Multi, '/multi/<int:num>')
    
    if __name__ == '__main__':
        app.run(debug=True)
    

    猫鼬.py

    from flask_mongoengine import MongoEngine
    from app import app
    import urllib
    
    database_name = "API"
    mongodb_password = ""
    DB_URI = "mongodb+srv://m001-student:"+ urllib.parse.quote(mongodb_password) +"@cluster0.hr17o.mongodb.net/{}?retryWrites=true&w=majority".format(database_name)
    app.config['MONGODB_HOST'] = DB_URI
    
    
    db = MongoEngine()
    db.init_app(app)
    
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-07-10
      • 2014-12-10
      • 1970-01-01
      • 2023-03-29
      • 1970-01-01
      • 2021-03-12
      • 1970-01-01
      相关资源
      最近更新 更多