Python 新客户端上的聊天服务器mysql查询

Python 新客户端上的聊天服务器mysql查询,python,twisted,mysql-python,Python,Twisted,Mysql Python,我有一个简单的聊天服务器,每当新客户端连接时,我都想查询我的数据库。我尝试使用twistar CRUD接口,但出现了一个奇怪的错误: exceptions.NameError:未定义全局名称“result” from twisted.internet.protocol import Factory from twisted.protocols.basic import LineReceiver from twisted.enterprise import adbapi from twisted.

我有一个简单的聊天服务器,每当新客户端连接时,我都想查询我的数据库。我尝试使用twistar CRUD接口,但出现了一个奇怪的错误:

exceptions.NameError:未定义全局名称“result”

from twisted.internet.protocol import Factory
from twisted.protocols.basic import LineReceiver
from twisted.enterprise import adbapi
from twisted.internet import reactor
from twistar.registry import Registry
from twistar.dbobject import DBObject

Registry.DBPOOL = adbapi.ConnectionPool('MySQLdb', host="localhost", db="testdb", user="test", passwd="test")
dbconfig = Registry.getConfig()

class Chat(LineReceiver):

    # Here is the callback
    def result(values):
        print values

    def __init__(self, users):
        self.users = users
        self.name = None
        self.state = "GETNAME"

    def connectionMade(self):
        self.sendLine("What's your name?")

    def connectionLost(self, reason):
        if self.users.has_key(self.name):
            del self.users[self.name]

    def lineReceived(self, line):
        if self.state == "GETNAME":
            self.handle_GETNAME(line)
        else:

    def handle_GETNAME(self, name):
        if self.users.has_key(name):
            self.sendLine("Name taken, please choose another.")
            return
        self.sendLine("Welcome, %s!" % (name,))
        # Here is the query
        d = dbconfig.select("testtable").addCallback(result)**

        self.name = name
        self.users[name] = self
        self.state = "CHAT"

    def handle_CHAT(self, message):
        message = "<%s> %s" % (self.name, message)
        for name, protocol in self.users.iteritems():
            if protocol != self:
                protocol.sendLine(message)

def result(var):
       print var

class ChatFactory(Factory):

    def __init__(self):
        self.users = {} # maps user names to Chat instances

    def buildProtocol(self, addr):
        return Chat(self.users)

reactor.listenTCP(8000, ChatFactory())
reactor.run()
来自twisted.internet.protocol导入工厂
从twisted.protocols.basic导入LineReceiver
从twisted.enterprise导入adbapi
从twisted.internet导入
从twistar.registry导入注册表
从twistar.dbobject导入dbobject
Registry.DBPOOL=adbapi.ConnectionPool('MySQLdb',host=“localhost”,db=“testdb”,user=“test”,passwd=“test”)
dbconfig=Registry.getConfig()
课堂聊天(LineReceiver):
#这是回拨电话
def结果(值):
打印值
定义初始化(自我,用户):
self.users=用户
self.name=None
self.state=“GETNAME”
def connectionMade(自):
self.sendLine(“你叫什么名字?”)
def connectionLost(自身、原因):
如果self.users.has_键(self.name):
del self.users[self.name]
def行已接收(自身,行):
如果self.state==“GETNAME”:
self.handle\u GETNAME(行)
其他:
def handle_GETNAME(self,name):
如果self.users.has_键(名称):
self.sendLine(“已取名称,请选择其他名称”)
返回
self.sendLine(“欢迎,%s!”%(名称,))
#这是一个问题
d=dbconfig.select(“testtable”).addCallback(结果)**
self.name=名称
self.users[name]=self
self.state=“聊天”
def handle_聊天室(自我、信息):
message=“%s”%(self.name,message)
对于名称,self.users.iteritems()中的协议:
如果协议!=自我:
协议发送线(消息)
def结果(var):
打印变量
类别:工厂(工厂):
定义初始化(自):
self.users={}#将用户名映射到聊天实例
def构建协议(自身、地址):
返回聊天(self.users)
reactor.listenTCP(8000,ChatFactory())
反应堆运行()
在聊天服务器之外,CRUD db查询可以正常工作


提前感谢您

如果结果是该类的成员,则必须以self开头

 d = dbconfig.select("testtable").addCallback(self.result)**

我看到Chat类下面定义了两个“result”方法,但由于它们没有缩进,所以我无法判断那里发生了什么。它们被标识为应该的。由于我是python的noob,所以我尝试按照您的建议进行修改。现在错误是“self.result=callback(self.result,*args,**kw)exceptions.TypeError:result()正好接受1个参数(给定2个)”。你们能帮忙吗?很难说,因为你们的缩进搞砸了,但若结果是一个成员函数,它需要self作为参数。def result(self,var)我认为第一个结果是一个成员函数,而第二个不是。我建议进行编辑以反映这一点。基于该假设,第一个结果应该是
def result(self,values):
@neppoz,成员函数(在类中)要求第一个参数是
self
。此假定参数将自动填充,以便在调用
self.result(blah)
时,它将变成
result(self,blah)
。您的错误是将2个值传递给一个函数,该函数只期望1,因为您缺少定义中的
self
参数。