Программа висит на порту, получает строку json'а, парсит, и записывает в БД (postgresql) объявленные данные, параллельно записывая эту строку в файл. Естественно для новичка, все это выглядит более или менее криво. Нужен рефакторинг, но это лирика.
Гораздо интереснее мне узнать как, осуществить проверку. Но для начала я опишу что хотелось бы мне от сообщества, какого рода помощи, быть может примеров.
#!/usr/bin/env python # -*- coding: utf-8 -*- import sys # Standart library for compile source import psycopg2 # Library for use connection with pgsql import simplejson # Lobrary for parse string in JSON # Server program from socket import * # Foll import library of using and create UDP server (sock) # Set the socket parameters host = "" # Listen any interfaces port = 5005 # Port Listener buf = 1500 # Size buffer for UDP listener addr = (host,port) # VARiable of sock connection # Create socket and bind to address UDPSock = socket(AF_INET,SOCK_DGRAM) # The create of socket connection UDPSock.bind(addr) # and accept configure # Connector pgsql con = psycopg2.connect('host=localhost dbname=logger_py user=log') # Connector for database pgsql cur = con.cursor() # Database connection cursor, aka. OPEN stream # Receive messages while True: data,addr = UDPSock.recvfrom(buf) # Recive the data input on host (listen up comment of 'addr') in standart stream on the UDPsock if data: # Statement of data res = simplejson.loads(data) # VARiable of using standart lib simplejson for parse stream in data (Recived on UDPSock) cur.execute("insert into logger_py(point, datatime, event_id, cardnumber, firstname, lastname, dep, nick) values (%s, %s, %s, %s, %s, %s, %s, %s)", (res['POINT'], res['DATATIME'], res['EVENTID'], res['CARDNUMBER'], res['FIRSTNAME'], res['LASTNAME'], res['DEP'], res['MIDDLENAME'])) # This is string of request in database with 8(eight row) and 8(eight) Values, # Which take the value of the parse content JSON con.commit() # Send request after check on exploite or injection, and close connection print "\nReceived message '", data,"'" # DEBUG info f = open('out.txt', 'a') # -= Special for СКЛЕРОЗ =- f.write("\nReceived message '") # -= параллельно пишем =- f.write(data) # -= полученные даныне =- f.write("' ;") # -= в файл в каталоге =- f.close() # -= ЗАКРЫВАЕМ =- print "\nReceived message '", data,"'" # DEBUG info # Close socket UDPSock.close()
JSON
Received message '{"POINT":"Дверь3","DATATIME":"2012-06-21 13:14:24","EVENTID":"22","CARDNUMBER":"********","FIRSTNAME":"username","LASTNAME":"usersurname","MIDDLENAME":"nickname","DEP":"departament"}' ;
Приведенный листинг, создает демон и начинает на порту слушать все что ему отправлет устройство, устройство натравлено на отправку данных именно на этот адрес:порт. Тут же процедура распарсивания JSON'а.
Однако если данные коннектора не верные (имя или порт) программа падает. Если все верно указано но база лежит, то программа запускается, однако как только прилетает на порт информация и срабатывает процедура, программа падает.
Что хотелось бы: Даже если коннектор не верный, или база лежит, программа чтобы не падала, но писала в файл, максимум в sqlite. Или же если коннектор вдруг упал или база, то и\или начать писать события в файл, причем помечая когда началась запись с отступом в файле о начале и об окончании, для визуального различия начала\конца операции, если коих будет не одна а несколько. Чтобы не путаться.
Заранее благодарю, за напуствия.