Currently I am new to programming and I thought Python and web2py would be
a good way to learn. But, I am in it over my head when it comes to this
problem. I'm getting an error when trying to access a db connection inside
a Thread which is contained inside a module. The most pertinent part of the
error is this. "if not self.connection: raise ValueError(a[0])" Here are
the related pieces of code which are causing the problem. I've tried
setting the value of db using a method inside coffee_server_threadR6. I
have tried every way I can think of to get db into the module.(including
current) and unfortunately once the tread is initialized I can't retrieve
or set any data from my database. The only thing that does work is seeing
which tables, and columns exist. So, it's as though once the variable db
gets placed into the thread it no longer has a connection to the database
at all. Any thoughts on this are appreciated.
Models - db.py
db = DAL('sqlite://storage.sqlite',pool_size=2,check_reserved=['all'],
do_connect=True)
Controllers - default
@auth.requires_login()
def startserv():
Server.ThreadedTCPRequestHandler.db = db
reactor = Server.Reactor()
reactor.daemon = True
reactor.start()
return redirect(URL('index'))
Modules - coffee_server_threadR6.py
#!/usr/bin/env python
# -*- coding: utf-8 -*-
from gluon import *
from gluon import current
import threading
import time
import SocketServer
import struct
import binascii
from subprocess import Popen
import databaseTest as Db_Conn
SEND_WAKEUP = chr(1)
AM_AWAKE = chr(0)
class ThreadedTCPRequestHandler(SocketServer.StreamRequestHandler):
cur_thread = threading.current_thread()
db = None
def wakeup_computer(self,mac):
Popen(['echo', str(mac)])
time.sleep(3)
Popen(['echo', str(mac)])
def handle(self):
recv_data = self.request.recv(1024)
packed_data = binascii.unhexlify(recv_data)
s = struct.Struct('c 17s')
self.unpacked_data = s.unpack(packed_data)
self.macAddr = str(self.unpacked_data[1])
self.command = self.unpacked_data[0]
response = "{}: {}".format(self.cur_thread.name, self.macAddr)
self.request.sendall(response)
self.updateDB(self.macAddr)
def updateDB(self,mac):
print self.db.computerstats.fields
print self.db.computerstats.mac_addr.type
print type(mac)
comp = self.db(self.db.computerstats.id=="1").select().first()
print comp
self.db(self.db.computerstats.mac_addr==mac).update(status=1)
self.db.commit()
#self.db(self.db.computerstats.mac_addr=='AA:BB:CC:DD:EE:FF').update(status=True)
class ThreadedTCPServer(SocketServer.ThreadingTCPServer):
pass
class CountThread(threading.Thread):
def run(self):
global TOTAL
for i in range(100):
TOTAL = TOTAL + 1
print('%s\n' % (TOTAL))
class Reactor(threading.Thread):
def run(self):
self.HOST, self.PORT = '', 8585
SocketServer.TCPServer.allow_reuse_address = True
self.server = ThreadedTCPServer((self.HOST, self.PORT),
ThreadedTCPRequestHandler)
print "Server is set up"
self.server.serve_forever()
coffee_client.py - Executed from another computer. Currently testing from
local machine.
from socket import *
import struct
import binascii
SEND_WAKEUP = chr(1)
AM_AWAKE = chr(0)
def send(data):
sock = socket(AF_INET,SOCK_STREAM)
sock.connect(('127.0.0.1',8585))
try:
sock.send(data)
response = sock.recv(1024)
print "Received: {}".format(response)
finally:
sock.close()
def wakeup(mac):
values = (SEND_WAKEUP, mac)
s = struct.Struct('c 17s')
packed_data = s.pack(*values)
hex_packed_data = binascii.hexlify(packed_data)
send(hex_packed_data)
def am_awake(mac):
values = (AM_AWAKE, mac)
s = struct.Struct('c 17s')
packed_data = s.pack(*values)
hex_packed_data = binascii.hexlify(packed_data)
send(hex_packed_data)
am_awake('AA:BB:CC:DD:EE:FF')
--
Resources:
- http://web2py.com
- http://web2py.com/book (Documentation)
- http://github.com/web2py/web2py (Source code)
- https://code.google.com/p/web2py/issues/list (Report Issues)
---
You received this message because you are subscribed to the Google Groups
"web2py-users" group.
To unsubscribe from this group and stop receiving emails from it, send an email
to [email protected].
For more options, visit https://groups.google.com/d/optout.