Python 新客户端上的聊天服务器mysql查询
我有一个简单的聊天服务器,每当新客户端连接时,我都想查询我的数据库。我尝试使用twistar CRUD接口,但出现了一个奇怪的错误: exceptions.NameError:未定义全局名称“result”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.
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
参数。