【问题标题】:AttributeError: 'str' object has no attribute 'client'AttributeError:“str”对象没有属性“client”
【发布时间】:2019-09-03 05:49:39
【问题描述】:

我有一个代码,我正在与 MongoDB 建立连接。这段代码是

连接MongoDB.py:

import pymongo
from pymongo import MongoClient
from flask import Flask, render_template, request,redirect,url_for

app = Flask(__name__)

# Connection to MongoDB

class ConnectMdb:
    @staticmethod
    def connect2mongodb():
        global client
        try:
            client = pymongo.MongoClient("mongodb") # modified to avoid showing actual string. Kindly ignore this part.
            print("Connected to Avengers MongoClient Successfully!!!")
            print (type(client))
            print(client)
        except:
            print("Connection to MongoClient Failed!!!")

        #db = client.avengers_hack_db
        return("Connection established")

if __name__ == '__main__':
   ConnectMdb.connect2mongodb()

我将此脚本导入另一个具有一些业务逻辑的程序中。以下是与此问题相关的部分代码:

ProcessData.py:


import pymongo
from pymongo import MongoClient
import datetime
import sys
from flask import Flask, render_template, request
#import ProcessTaskData
#import werkzeug
import ConnectMongoDB as cDB
app = Flask(__name__)

CMdb = cDB.ConnectMdb.connect2mongodb()

db = CMdb.client.avengers_hack_db

@app.route('/')
def index():
  return render_template('index.html')

@app.route('/Avengers',methods = ['POST'])  
def Avengers():
    ip = request.remote_addr
    Project_ID = request.form['pid'] 
    Name = request.form['pname'] 
    Resource_Names = request.form['rsrc']

    db.ppm_master_db_collection.insert_many([
            {"Org_Id":"",
             "Name": Name,     
             "last_modified": datetime.datetime.utcnow()}
        ]) 
    return render_template('ptasks.html', user_ip=ip)   

@app.route('/ProjectTasks',methods = ['POST'])  
def ProjectTask():
    ip = request.remote_addr
    Task_ID = request.form['tid'] 
    TAlert = request.form['talrt']
    TResource_Names = request.form['trsrc']

    db.ppm_tasks_data_collection.insert_many([
            {"Task_ID": Task_ID,
             "Resource_Names": TResource_Names,
             "last_modified": datetime.datetime.utcnow()}
            ])  
    return render_template('ptasks.html', user_ip=ip)

if __name__ == '__main__':  
   app.run(debug = True)

如果我将 ConnectMongoDB.py 中的代码直接放在 ProcessData.py 中而不是导入,它会很好用。但是从单独的文件中会出错。

另外,客户端的类型是:

 <class 'pymongo.mongo_client.MongoClient'>

理想情况下,它应该像代码在 ProcessData.py 中一样正常运行(也建立与 db 的连接)。不知道我错过了哪里。

【问题讨论】:

  • 这段代码有明显的语法和缩进错误。如果您不发布实际代码,我们将无能为力。
  • @JohnGordon 我已经用完整的代码更新了代码。希望有帮助吗?
  • 如果由于路径导致导入错误,请在将 ConnectMongoDB 作为 cDB 导入之前尝试此操作: sys.path.append(r'C:\Users\...CompleteFolderPath where is ConnectMongoDB')将 ConnectMongoDB 导入为 cDB
  • @Manuel - 我不确定为什么会出现错误。我不认为这是路径问题。与导入包后的数据类型转换有关。
  • 错误消息AttributeError: 'str' object has no attribute 'client' 表示您正在尝试对str(字符串)数据类型调用.client 方法。所以只要在代码中找到.client方法并找出(按键盘快捷键“CTRL”+“F”找出文本)就足够了,因此,左边部分是字符串类型,为什么是不是必需的对象(例如:函数、类、模块等)。

标签: python mongodb flask


【解决方案1】:

改变 db = CMdb.client.avengers_hack_dbdb = cDB.client.avengers_hack_db 应该让你的错误消失,你引用了错误的东西。你的静态方法的返回值是一个字符串,它没有客户端属性。


如果您的 connect2mongodb 方法可以使用 return client,则更好的方法是:

class ConnectMdb:
    @staticmethod
    def connect2mongodb():
        try:
            client = pymongo.MongoClient("mongodb") # modified to avoid showing actual string. Kindly ignore this part.
            print("Connected to Avengers MongoClient Successfully!!!")
            print (type(client))
            print(client)
        except:
            raise Exception("Connection to MongoClient Failed!!!")

        return client

这种方式db = CMdb.client.avengers_hack_db 可以工作。

【讨论】:

  • @Trapil - 非常感谢朋友。我使用了更好的方法,它解决了这个问题。看起来我必须实现这两种解决方案。因为,如果我不将 'db = CMdb.client.avengers_hack_db' 更改为 'db = cDB.client.avengers_hack_db',那么我会收到类似的 db 错误。 “str”对象没有属性“db”
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-09-10
  • 2021-10-04
  • 2019-12-02
  • 2021-09-25
  • 2014-03-04
相关资源
最近更新 更多