Python + jQuery 的小型聊天室


用 Python 和 jQuery 寫了一支小型的對話程式.
是以 CGI 方式實現出來的,不過 Web 的 Query 部份沒用到本身的模組來解釋.
用了自己的方法來解釋,雖然論強大雖比不上原來的,可是卻能應付自己的需要..

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
#!/usr/bin/python
#coding=utf-8
#=============================================
"""
Author : Zeuxis Lo
P-Date : 19/8/2009 14:05
P-Name : PyIChat
Verison: 0.1.0
"""
#=============================================

timeZone = 8
fileMessIndex = "database/message.idx"
fileMessData = "database/message.txt"

#=============================================

import os
import sys
import json
import time
import urllib

class Message:
def __init__(self):
pass

def getMessage(self):
if int(FORM['messId']) <= 0:
return False
else:
table = {}
f = open(fileMessData, 'r')
for row in f.readlines():
idx, username, gender, color, say, timestamp, end = row.split('<>')
if int(idx) > int(FORM['messId']):
table[idx] = {
'messId': idx,
'username': username,
'gender': gender,
'color': color,
'say': say,
'timestamp': self.dateFormat(float(timestamp))
}
f.close()

return table

def getMessageId(self):
return open(fileMessIndex, 'r').read()

def save(self):
try:
f = open(fileMessIndex, 'r+')
d = str(int(f.read())+1)
f.seek(0, 0)
f.write(d)
f.close()

f = open(fileMessData, 'a+')
f.writelines("%s<>%s<>%s<>%s<>%s<>%s<>\n" % (d, self.username, self.gender, self.color, self.say, self.timestamp))
f.close()

self.messId = d

return True
except:
return False

def dateFormat(self, timestamp, toFormat = "%Y-%m-%d %H:%M:%S"):
return time.strftime(toFormat, time.gmtime(timestamp+timeZone*3600))

class Chat:
def __init__(self):
if FORM['sk'] == 'save':
self.saveMessage()
elif FORM['sk'] == 'getMessId':
self.getMessageId()
elif FORM['sk'] == 'show':
self.showMessageById()

def showMessageById(self):
message = Message()
messageTable = message.getMessage()
if messageTable == False:
self.showError('顯示訊息失敗')
else:
self.showMessage(messageTable)

def getMessageId(self):
message = Message()
self.showMessage({'id': message.getMessageId()})

def saveMessage(self):
if self.checkValue() == True:
message = Message()
message.username = FORM['username']
message.gender = FORM['gender']
message.color = FORM['color']
message.say = FORM['say']
message.timestamp = time.time()

if message.save() == True:
self.showMessage({
'messId': message.messId,
'username': FORM['username'],
'gender': FORM['gender'],
'color': FORM['color'],
'say': FORM['say'],
'dateTime': self.dateFormat(time.time())
})
else:
self.showError('發送訊息失敗')

def checkValue(self):
if len(FORM['username']) <= 0:
self.showError('暱稱不能為空')
elif FORM['gender'] not in ('1', '2'):
self.showError('性別不正確')
elif len(FORM['color']) < 3:
self.showError('沒有筆色')
elif len(FORM['say']) <= 0:
self.showError('沒有說話')
else:
return True

def dateFormat(self, timestamp, toFormat = "%Y-%m-%d %H:%M:%S"):
return time.strftime(toFormat, time.gmtime(timestamp+timeZone*3600))

def showError(self, msg):
self.showMessage(msg, 'ERR')

def showMessage(self, msg, status = 'MSG'):
print json.dumps({'status': status, 'message': msg})
sys.exit()

if __name__ == "__main__":
print "content-type:text/html; charset=utf-8"
print

FORM = {}

if 'CONTENT_LENGTH' in os.environ:
pairs = sys.stdin.read(int(os.environ['CONTENT_LENGTH'])).split('&')
for pair in pairs:
name, value = pair.split('=')
FORM[name] = urllib.unquote_plus(urllib.unquote(value))

Chat()

全部代碼: PyIChat.7z