gyorgy@0
|
1 """
|
gyorgy@0
|
2 Tutorial - Multiple objects
|
gyorgy@0
|
3
|
gyorgy@0
|
4 This tutorial shows you how to create a site structure through multiple
|
gyorgy@0
|
5 possibly nested request handler objects.
|
gyorgy@0
|
6 """
|
gyorgy@0
|
7
|
gyorgy@0
|
8 import cherrypy, os, random
|
gyorgy@0
|
9 from cherrypy.lib.static import serve_file
|
gyorgy@0
|
10 from templates import *
|
gyorgy@0
|
11
|
gyorgy@0
|
12 from DirectorySession import DirectorySession
|
gyorgy@0
|
13
|
gyorgy@0
|
14 #from pprint import pprint
|
gyorgy@0
|
15
|
gyorgy@0
|
16 PATH = os.path.abspath(os.path.dirname(__file__))
|
gyorgy@0
|
17
|
gyorgy@0
|
18
|
gyorgy@0
|
19 #audiodir = './audio'
|
gyorgy@0
|
20 #cherrypy.session['fxs'] = [cherrypy.session['f'] for cherrypy.session['f'] in os.listdir(audiodir) if os.path.isdir(os.path.join(audiodir, cherrypy.session['f']))]
|
gyorgy@0
|
21 #cherrypy.session['fxs'].remove('dry')
|
gyorgy@0
|
22 #print cherrypy.session['fxs']
|
gyorgy@0
|
23
|
gyorgy@0
|
24 class Root(object): pass
|
gyorgy@0
|
25
|
gyorgy@0
|
26
|
gyorgy@0
|
27 class HomePage:
|
gyorgy@0
|
28 def index(self):
|
gyorgy@0
|
29
|
gyorgy@0
|
30
|
gyorgy@0
|
31
|
gyorgy@0
|
32 return "empty"
|
gyorgy@0
|
33
|
gyorgy@0
|
34
|
gyorgy@0
|
35 index.exposed = True
|
gyorgy@0
|
36
|
gyorgy@0
|
37 class TestPage:
|
gyorgy@0
|
38
|
gyorgy@0
|
39 def getFiles(self):
|
gyorgy@0
|
40 audiodir = './audio'
|
gyorgy@0
|
41 cherrypy.session['fxs'] = [cherrypy.session['f'] for cherrypy.session['f'] in os.listdir(audiodir) if os.path.isdir(os.path.join(audiodir, cherrypy.session['f']))]
|
gyorgy@0
|
42 cherrypy.session['fxs'].remove('dry')
|
gyorgy@0
|
43 print cherrypy.session['fxs']
|
gyorgy@0
|
44
|
gyorgy@0
|
45 def index(self):
|
gyorgy@0
|
46 TestPage.getFiles(self)
|
gyorgy@0
|
47 cherrypy.session['sid'] = None
|
gyorgy@0
|
48 cherrypy.session['sid_filename'] = None
|
gyorgy@0
|
49
|
gyorgy@0
|
50 cherrypy.session['test'] = None
|
gyorgy@0
|
51 cherrypy.session['results'] = None
|
gyorgy@0
|
52 cherrypy.session['tests'] = None
|
gyorgy@0
|
53 cherrypy.session['test_nr'] = None
|
gyorgy@0
|
54 cherrypy.session['audio_pairs'] = None
|
gyorgy@0
|
55 cherrypy.session['page'] = None
|
gyorgy@0
|
56 cherrypy.session['pages'] = 4
|
gyorgy@0
|
57 cherrypy.session['userinfobox'] = None
|
gyorgy@0
|
58 #return '''
|
gyorgy@0
|
59 # <p>
|
gyorgy@0
|
60 # <a href="/test/">start test</a>
|
gyorgy@0
|
61 # </p>'''
|
gyorgy@0
|
62 cherrypy.session['sid'] = cherrypy.session.get_session_path().split('/')[1]
|
gyorgy@0
|
63 print cherrypy.session['sid']
|
gyorgy@0
|
64
|
gyorgy@0
|
65
|
gyorgy@0
|
66
|
gyorgy@0
|
67 return welcome_templ %cherrypy.session['sid']
|
gyorgy@0
|
68
|
gyorgy@0
|
69
|
gyorgy@0
|
70
|
gyorgy@0
|
71 def doStart(self, sessionId, startButton, userinfobox=None):
|
gyorgy@0
|
72 cherrypy.session['userinfobox'] = userinfobox
|
gyorgy@0
|
73 cherrypy.session['sessionId'] = sessionId
|
gyorgy@0
|
74 #print "sid:"
|
gyorgy@0
|
75 #print TestPage.sid
|
gyorgy@0
|
76 #print sessionId
|
gyorgy@0
|
77 if cherrypy.session['sid'] != str(cherrypy.session['sessionId']):
|
gyorgy@0
|
78 return TestPage.sessionError(self)
|
gyorgy@0
|
79 else:
|
gyorgy@0
|
80 return TestPage.index2(self)
|
gyorgy@0
|
81
|
gyorgy@0
|
82
|
gyorgy@0
|
83
|
gyorgy@0
|
84
|
gyorgy@0
|
85 def index2(self):
|
gyorgy@0
|
86 try: print testvar
|
gyorgy@0
|
87 except: pass
|
gyorgy@0
|
88 #testvar = "00000000000000000000000000000000000000000000000000000000000000000000000000"
|
gyorgy@0
|
89 #TestPage.sid = TestPage.getSid(self)
|
gyorgy@0
|
90
|
gyorgy@0
|
91 #if TestPage.sid != TestPage.sidstart:
|
gyorgy@0
|
92 # return TestPage.sessionError(self)
|
gyorgy@0
|
93
|
gyorgy@0
|
94
|
gyorgy@0
|
95 #TestPage.sid_filename = 'results/%s.txt'%TestPage.sid
|
gyorgy@0
|
96 #TestPage.sid_userinfofilename = 'results/%s_info.txt'%TestPage.sid
|
gyorgy@0
|
97 #print TestPage.sid_filename
|
gyorgy@0
|
98
|
gyorgy@0
|
99 #cherrypy.session['userinfo'] = userinfo
|
gyorgy@0
|
100
|
gyorgy@0
|
101
|
gyorgy@0
|
102 #cherrypy.session.write_data(userinfo+'\n','results.txt')
|
gyorgy@0
|
103
|
gyorgy@0
|
104 #f = open(TestPage.sid_userinfofilename, 'w')
|
gyorgy@0
|
105 #f.write('%s\n%s'%(TestPage.sid, str(userinfo)))
|
gyorgy@0
|
106 #f.close()
|
gyorgy@0
|
107
|
gyorgy@0
|
108
|
gyorgy@0
|
109 # TestPage.pageComplete = []
|
gyorgy@0
|
110 # for n in xrange(TestPage.pages):
|
gyorgy@0
|
111 # TestPage.pageComplete.append(0)
|
gyorgy@0
|
112
|
gyorgy@0
|
113
|
gyorgy@0
|
114 #take 2 examples for each effect
|
gyorgy@0
|
115
|
gyorgy@0
|
116 cherrypy.session['audio_pairs'] = []
|
gyorgy@0
|
117
|
gyorgy@0
|
118 # get effected files:
|
gyorgy@0
|
119
|
gyorgy@0
|
120 for cherrypy.session['fx'] in cherrypy.session['fxs']:
|
gyorgy@0
|
121 cherrypy.session['dirlist'] = os.listdir('./audio/%s/'%cherrypy.session['fx'])
|
gyorgy@0
|
122 cherrypy.session['filelist'] = []
|
gyorgy@0
|
123 for cherrypy.session['item'] in cherrypy.session['dirlist']:
|
gyorgy@0
|
124 if cherrypy.session['item'].split('.')[-1] == 'mp3':
|
gyorgy@0
|
125 cherrypy.session['filelist'].append(cherrypy.session['item'].split('.')[0])
|
gyorgy@0
|
126
|
gyorgy@0
|
127 # create audio pairs for this fx
|
gyorgy@0
|
128
|
gyorgy@0
|
129 cherrypy.session['first'] = cherrypy.session['second'] = random.choice(cherrypy.session['filelist'])
|
gyorgy@0
|
130 while cherrypy.session['first'] == cherrypy.session['second']:
|
gyorgy@0
|
131 cherrypy.session['second'] = random.choice(cherrypy.session['filelist'])
|
gyorgy@0
|
132
|
gyorgy@0
|
133 cherrypy.session['dry1'] = 'dry/%s' %cherrypy.session['first'].split('_%s'%cherrypy.session['fx'])[0]
|
gyorgy@0
|
134 cherrypy.session['fx1'] = '%s/%s' %(cherrypy.session['first'], cherrypy.session['fx'])
|
gyorgy@0
|
135 cherrypy.session['dry2'] = 'dry/%s' %cherrypy.session['second'].split('_%s'%cherrypy.session['fx'])[0]
|
gyorgy@0
|
136 cherrypy.session['fx2'] = '%s/%s' %(cherrypy.session['fx'], cherrypy.session['second'])
|
gyorgy@0
|
137 cherrypy.session['audio_pairs'].append([cherrypy.session['fx'], cherrypy.session['dry1'], cherrypy.session['fx1']])
|
gyorgy@0
|
138 cherrypy.session['audio_pairs'].append([cherrypy.session['fx'], cherrypy.session['dry2'], cherrypy.session['fx2']])
|
gyorgy@0
|
139
|
gyorgy@0
|
140 #print TestPage.audio_pairs
|
gyorgy@0
|
141 random.shuffle(cherrypy.session['audio_pairs'])
|
gyorgy@0
|
142
|
gyorgy@0
|
143 cherrypy.session['page'] = 1
|
gyorgy@0
|
144 cherrypy.session['pages'] = 4
|
gyorgy@0
|
145 cherrypy.session['tests'] = 10 * cherrypy.session['pages']
|
gyorgy@0
|
146 cherrypy.session['results'] = []
|
gyorgy@0
|
147 for cherrypy.session['n'] in xrange(cherrypy.session['tests']): cherrypy.session['results'].append([None,0,0,0,0])
|
gyorgy@0
|
148
|
gyorgy@0
|
149
|
gyorgy@0
|
150 # create tuple to fill template
|
gyorgy@0
|
151 cherrypy.session['ts'] = []
|
gyorgy@0
|
152 for cherrypy.session['k'] in xrange(40):
|
gyorgy@0
|
153 cherrypy.session['ts'].append(0)
|
gyorgy@0
|
154 cherrypy.session['ts'].append(cherrypy.session['page'])
|
gyorgy@0
|
155 cherrypy.session['ts'].append(cherrypy.session['pages'])
|
gyorgy@0
|
156 for k in xrange(10):
|
gyorgy@0
|
157 pos = 10 * (cherrypy.session['page'] - 1) + k
|
gyorgy@0
|
158 #print pos
|
gyorgy@0
|
159 for n in xrange(3): cherrypy.session['ts'].append(cherrypy.session['audio_pairs'][pos][1])
|
gyorgy@0
|
160 for n in xrange(3): cherrypy.session['ts'].append(cherrypy.session['audio_pairs'][pos][2])
|
gyorgy@0
|
161 cherrypy.session['ts'].append(cherrypy.session['page'])
|
gyorgy@0
|
162 cherrypy.session['ts'].append(cherrypy.session['sid'])
|
gyorgy@0
|
163 cherrypy.session['ts'] = tuple(cherrypy.session['ts'])
|
gyorgy@0
|
164 print cherrypy.session['ts']
|
gyorgy@0
|
165
|
gyorgy@0
|
166 return audiotempl %cherrypy.session['ts']
|
gyorgy@0
|
167
|
gyorgy@0
|
168
|
gyorgy@0
|
169
|
gyorgy@0
|
170
|
gyorgy@0
|
171
|
gyorgy@0
|
172
|
gyorgy@0
|
173
|
gyorgy@0
|
174 def doAttrib(self, pageId, sessionId, submitButton, attribute1_1=None, attribute1_2=None, attribute1_3=None, attribute1_4=None, attribute2_1=None, attribute2_2=None, attribute2_3=None, attribute2_4=None, attribute3_1=None, attribute3_2=None, attribute3_3=None, attribute3_4=None, attribute4_1=None, attribute4_2=None, attribute4_3=None, attribute4_4=None, attribute5_1=None, attribute5_2=None, attribute5_3=None, attribute5_4=None, attribute6_1=None, attribute6_2=None, attribute6_3=None, attribute6_4=None, attribute7_1=None, attribute7_2=None, attribute7_3=None, attribute7_4=None, attribute8_1=None, attribute8_2=None, attribute8_3=None, attribute8_4=None, attribute9_1=None, attribute9_2=None, attribute9_3=None, attribute9_4=None, attribute10_1=None, attribute10_2=None, attribute10_3=None, attribute10_4=None):
|
gyorgy@0
|
175 #print attribute1 + ' ' + attribute2
|
gyorgy@0
|
176 # Error check
|
gyorgy@0
|
177
|
gyorgy@0
|
178
|
gyorgy@0
|
179
|
gyorgy@0
|
180
|
gyorgy@0
|
181
|
gyorgy@0
|
182 print "################################# %s" %pageId
|
gyorgy@0
|
183 #_pageId = int(pageId) - 1
|
gyorgy@0
|
184
|
gyorgy@0
|
185 if cherrypy.session['page'] != int(pageId):
|
gyorgy@0
|
186 print "################################# BACK BUTTON PRESSED #################################"
|
gyorgy@0
|
187 #resString = ',\n'.join(str(x) for x in TestPage.results)
|
gyorgy@0
|
188 #resString += '\n\nERROR: BACK BUTTON PRESSED'
|
gyorgy@0
|
189 #f = open(TestPage.sid_filename, 'w')
|
gyorgy@0
|
190 #f.write(resString)
|
gyorgy@0
|
191 #f.close()
|
gyorgy@0
|
192 #return '''
|
gyorgy@0
|
193 # <p>
|
gyorgy@0
|
194 # <a href="/test/">nooo! you pressed the back button, please start again!</a>
|
gyorgy@0
|
195 # </p>'''
|
gyorgy@0
|
196
|
gyorgy@0
|
197 # instead: overwrite previously submitted data. WILL THE OLD VALUES BE SUBMITTED AGAIN IN ALL BROWSERS?
|
gyorgy@0
|
198 cherrypy.session['page'] = int(pageId)
|
gyorgy@0
|
199
|
gyorgy@0
|
200
|
gyorgy@0
|
201
|
gyorgy@0
|
202 if cherrypy.session['sid'] != str(sessionId):
|
gyorgy@0
|
203 return TestPage.sessionError(self)
|
gyorgy@0
|
204
|
gyorgy@0
|
205
|
gyorgy@0
|
206
|
gyorgy@0
|
207 #store results
|
gyorgy@0
|
208
|
gyorgy@0
|
209 cherrypy.session['pos'] = 10 * (cherrypy.session['page'] - 1)
|
gyorgy@0
|
210
|
gyorgy@0
|
211 cherrypy.session['results'][cherrypy.session['pos']] = [cherrypy.session['audio_pairs'][cherrypy.session['pos']][2].split('/')[-1], int(attribute1_1), int(attribute1_2), int(attribute1_3), int(attribute1_4)]
|
gyorgy@0
|
212 cherrypy.session['results'][cherrypy.session['pos']+1] = [cherrypy.session['audio_pairs'][cherrypy.session['pos']+1][2].split('/')[-1], int(attribute2_1), int(attribute2_2), int(attribute2_3), int(attribute2_4)]
|
gyorgy@0
|
213 cherrypy.session['results'][cherrypy.session['pos']+2] = [cherrypy.session['audio_pairs'][cherrypy.session['pos']+2][2].split('/')[-1], int(attribute3_1), int(attribute3_2), int(attribute3_3), int(attribute3_4)]
|
gyorgy@0
|
214 cherrypy.session['results'][cherrypy.session['pos']+3] = [cherrypy.session['audio_pairs'][cherrypy.session['pos']+3][2].split('/')[-1], int(attribute4_1), int(attribute4_2), int(attribute4_3), int(attribute4_4)]
|
gyorgy@0
|
215 cherrypy.session['results'][cherrypy.session['pos']+4] = [cherrypy.session['audio_pairs'][cherrypy.session['pos']+4][2].split('/')[-1], int(attribute5_1), int(attribute5_2), int(attribute5_3), int(attribute5_4)]
|
gyorgy@0
|
216 cherrypy.session['results'][cherrypy.session['pos']+5] = [cherrypy.session['audio_pairs'][cherrypy.session['pos']+5][2].split('/')[-1], int(attribute6_1), int(attribute6_2), int(attribute6_3), int(attribute6_4)]
|
gyorgy@0
|
217 cherrypy.session['results'][cherrypy.session['pos']+6] = [cherrypy.session['audio_pairs'][cherrypy.session['pos']+6][2].split('/')[-1], int(attribute7_1), int(attribute7_2), int(attribute7_3), int(attribute7_4)]
|
gyorgy@0
|
218 cherrypy.session['results'][cherrypy.session['pos']+7] = [cherrypy.session['audio_pairs'][cherrypy.session['pos']+7][2].split('/')[-1], int(attribute8_1), int(attribute8_2), int(attribute8_3), int(attribute8_4)]
|
gyorgy@0
|
219 cherrypy.session['results'][cherrypy.session['pos']+8] = [cherrypy.session['audio_pairs'][cherrypy.session['pos']+8][2].split('/')[-1], int(attribute9_1), int(attribute9_2), int(attribute9_3), int(attribute9_4)]
|
gyorgy@0
|
220 cherrypy.session['results'][cherrypy.session['pos']+9] = [cherrypy.session['audio_pairs'][cherrypy.session['pos']+9][2].split('/')[-1], int(attribute10_1), int(attribute10_2), int(attribute10_3), int(attribute10_4)]
|
gyorgy@0
|
221
|
gyorgy@0
|
222
|
gyorgy@0
|
223 resString = cherrypy.session['sid'] + '\n' + cherrypy.session['userinfobox'] + '\n' + ',\n'.join(str(x) for x in cherrypy.session['results'])
|
gyorgy@0
|
224
|
gyorgy@0
|
225 #f = open(TestPage.sid_filename, 'w')
|
gyorgy@0
|
226 #f.write(resString)
|
gyorgy@0
|
227 #f.close()
|
gyorgy@0
|
228
|
gyorgy@0
|
229 cherrypy.session.write_data(resString,'%s.txt'%cherrypy.session['sid'])
|
gyorgy@0
|
230
|
gyorgy@0
|
231 if cherrypy.session['page'] < cherrypy.session['pages']:
|
gyorgy@0
|
232 cherrypy.session['page'] += 1
|
gyorgy@0
|
233
|
gyorgy@0
|
234 # create tuple to fill template
|
gyorgy@0
|
235 cherrypy.session['ts'] = []
|
gyorgy@0
|
236 cherrypy.session['npos'] = cherrypy.session['pos'] + 10
|
gyorgy@0
|
237 for cherrypy.session['k'] in xrange(10):
|
gyorgy@0
|
238 for cherrypy.session['i'] in xrange(4):
|
gyorgy@0
|
239 cherrypy.session['ts'].append(cherrypy.session['results'][cherrypy.session['npos']+cherrypy.session['k']][cherrypy.session['i']+1])
|
gyorgy@0
|
240 cherrypy.session['ts'].append(cherrypy.session['page'])
|
gyorgy@0
|
241 cherrypy.session['ts'].append(cherrypy.session['pages'])
|
gyorgy@0
|
242 for cherrypy.session['n'] in xrange(10):
|
gyorgy@0
|
243 pos = 10 * (cherrypy.session['page'] - 1) + cherrypy.session['n']
|
gyorgy@0
|
244 #print pos
|
gyorgy@0
|
245 for n in xrange(3): cherrypy.session['ts'].append(cherrypy.session['audio_pairs'][pos][1])
|
gyorgy@0
|
246 for n in xrange(3): cherrypy.session['ts'].append(cherrypy.session['audio_pairs'][pos][2])
|
gyorgy@0
|
247 cherrypy.session['ts'].append(cherrypy.session['page'])
|
gyorgy@0
|
248 cherrypy.session['ts'].append(cherrypy.session['sid'])
|
gyorgy@0
|
249 cherrypy.session['ts'] = tuple(cherrypy.session['ts'])
|
gyorgy@0
|
250
|
gyorgy@0
|
251 return audiotempl %cherrypy.session['ts']
|
gyorgy@0
|
252 else:
|
gyorgy@0
|
253 #end_filename = 'results/%s_f.txt'%TestPage.sid
|
gyorgy@0
|
254 #os.rename(TestPage.sid_filename, end_filename)
|
gyorgy@0
|
255
|
gyorgy@0
|
256 print cherrypy.session['results']
|
gyorgy@0
|
257 #_results = []
|
gyorgy@0
|
258
|
gyorgy@0
|
259 cherrypy.session['templ'] = ''
|
gyorgy@0
|
260 for cherrypy.session['n'] in xrange(cherrypy.session['tests']):
|
gyorgy@0
|
261 cherrypy.session['_templ'] = endtempl2 %(cherrypy.session['results'][cherrypy.session['n']][0], cherrypy.session['results'][cherrypy.session['n']][1], cherrypy.session['results'][cherrypy.session['n']][2], cherrypy.session['results'][cherrypy.session['n']][3], cherrypy.session['results'][cherrypy.session['n']][4])
|
gyorgy@0
|
262 cherrypy.session['templ'] += cherrypy.session['_templ']
|
gyorgy@0
|
263
|
gyorgy@0
|
264 #TestPage.pageComplete += 1
|
gyorgy@0
|
265 cherrypy.session['sid'] = None
|
gyorgy@0
|
266 return endtempl%cherrypy.session['templ'] + """\n<a href="/test/">start test</a>"""
|
gyorgy@0
|
267
|
gyorgy@0
|
268 index.exposed = True
|
gyorgy@0
|
269 doAttrib.exposed = True
|
gyorgy@0
|
270 index2.exposed = True
|
gyorgy@0
|
271 doStart.exposed = True
|
gyorgy@0
|
272
|
gyorgy@0
|
273
|
gyorgy@0
|
274 def sessionError(TestPage):
|
gyorgy@0
|
275 print "################################# SESSION ERROR #################################"
|
gyorgy@0
|
276 cherrypy.session['resString'] = str(cherrypy.session['sid']) + '\n' + cherrypy.session['userinfobox'] + '\n' + ',\n'.join(str(x) for x in cherrypy.session['results'])
|
gyorgy@0
|
277 cherrypy.session['resString'] += '\n\nERROR: SESSION CONFUSION'
|
gyorgy@0
|
278 #f = open(TestPage.sid_filename, 'w')
|
gyorgy@0
|
279 #f.write(resString)
|
gyorgy@0
|
280 #f.close()
|
gyorgy@0
|
281 cherrypy.session.write_data(cherrypy.session['resString'],'%s.txt'%cherrypy.session['sid'])
|
gyorgy@0
|
282
|
gyorgy@0
|
283 return '''
|
gyorgy@0
|
284 <p>
|
gyorgy@0
|
285 <a href="/test/">oh noes! there is something wrong with your session, please start again or go for a coffee!</a>
|
gyorgy@0
|
286 </p>'''
|
gyorgy@0
|
287
|
gyorgy@0
|
288
|
gyorgy@0
|
289 # def getSid(TestPage):
|
gyorgy@0
|
290 # result_txts = os.listdir('results')
|
gyorgy@0
|
291 # print result_txts
|
gyorgy@0
|
292 # sid = int(random.random() * 100000000)
|
gyorgy@0
|
293 # sid_filen = '%s.txt'%sid
|
gyorgy@0
|
294 # while sid_filen in result_txts:
|
gyorgy@0
|
295 # sid = int(random.random() * 100000000)
|
gyorgy@0
|
296 # sid_filen = '%s.txt'%sid
|
gyorgy@0
|
297 # return sid
|
gyorgy@0
|
298
|
gyorgy@0
|
299
|
gyorgy@0
|
300 # Of course we can also mount request handler objects right here!
|
gyorgy@0
|
301 root = HomePage()
|
gyorgy@0
|
302 root.test = TestPage()
|
gyorgy@0
|
303 #root = TestPage()
|
gyorgy@0
|
304
|
gyorgy@0
|
305
|
gyorgy@0
|
306 tutconf = os.path.join(os.path.dirname(__file__), 'conf.conf')
|
gyorgy@0
|
307
|
gyorgy@0
|
308 if __name__ == '__main__':
|
gyorgy@0
|
309 # CherryPy always starts with app.root when trying to map request URIs
|
gyorgy@0
|
310 # to objects, so we need to mount a request handler root. A request
|
gyorgy@0
|
311 # to '/' will be mapped to HelloWorld().index().
|
gyorgy@0
|
312 cherrypy.quickstart(root, config=tutconf)
|
gyorgy@0
|
313 else:
|
gyorgy@0
|
314 # This branch is for the test suite; you can ignore it.
|
gyorgy@0
|
315 cherrypy.tree.mount(root, config=tutconf)
|
gyorgy@0
|
316
|