質問編集履歴

1

httphandler.pyについてコードを掲載しました。

2020/06/03 15:53

投稿

NaokiIguchi
NaokiIguchi

スコア0

test CHANGED
File without changes
test CHANGED
@@ -155,3 +155,229 @@
155
155
 
156
156
 
157
157
  ```
158
+
159
+
160
+
161
+ ### httphandler.pyについて
162
+
163
+
164
+
165
+ httphandlerは以下の様なコードになります。
166
+
167
+
168
+
169
+ ```Python Console
170
+
171
+ # 標準モジュールをimportする。
172
+
173
+ import cgi
174
+
175
+ import os
176
+
177
+
178
+
179
+
180
+
181
+ class Request(object):
182
+
183
+ """
184
+
185
+ HTTPのリクエストをハンドリングするクラスです。
186
+
187
+ CGI側でインスタンスを生成することによって利用する
188
+
189
+ クエリデータや環境変数へのアクセス、主要ヘッダへの
190
+
191
+ アクセス用メソッドを提供します。
192
+
193
+ """
194
+
195
+
196
+
197
+ def __init__(self, environ=os.environ):
198
+
199
+ """
200
+
201
+ インスタンスの初期化メソッド
202
+
203
+ クエリ、環境変数をアトリビュートとして保持する。
204
+
205
+ """
206
+
207
+ self.form = cgi.FieldStorage()
208
+
209
+ self.environ = environ
210
+
211
+
212
+
213
+
214
+
215
+ def get_htmltemplate():
216
+
217
+ """
218
+
219
+ レスポンスとして返すHTMLのうち,定型部分を返す
220
+
221
+ """
222
+
223
+ html_body = u"""
224
+
225
+ <html>
226
+
227
+ <head>
228
+
229
+ <meta http-equiv="content-type"
230
+
231
+ content="text/html;charset=utf-8" />
232
+
233
+ </head>
234
+
235
+ <body>
236
+
237
+ %s
238
+
239
+ </body>
240
+
241
+ </html>"""
242
+
243
+ return html_body
244
+
245
+
246
+
247
+
248
+
249
+ class Response(object):
250
+
251
+ """
252
+
253
+ HTTPのレスポンスをハンドリングするクラスです。
254
+
255
+ レスポンスを送信する前にインスタンスを生成して利用します。
256
+
257
+ レスポンスやヘッダの内容を保持し、ヘッダを含めたレスポンスの
258
+
259
+ 送信を行います。
260
+
261
+ """
262
+
263
+
264
+
265
+ def __init__(self, charset='utf-8'):
266
+
267
+ self.headers = {'Content-type': 'text/html;charset=%s' % charset}
268
+
269
+ self.body = ""
270
+
271
+ self.status = 200
272
+
273
+ self.status_message = ''
274
+
275
+
276
+
277
+ def set_header(self, name, value):
278
+
279
+ """
280
+
281
+ レスポンスのヘッダを設定する。
282
+
283
+ :param name:
284
+
285
+ :param value:
286
+
287
+ :return:
288
+
289
+ """
290
+
291
+ self.headers[name] = value
292
+
293
+
294
+
295
+ def get_header(self, name):
296
+
297
+ """
298
+
299
+ 設定済みのレスポンス用ヘッダを返す
300
+
301
+ :param name:
302
+
303
+ :return:
304
+
305
+ """
306
+
307
+ return self.headers.get(name, None)
308
+
309
+
310
+
311
+ def set_body(self, bodystr):
312
+
313
+ """
314
+
315
+ レスポンスとして出力する本文の文字列を返す
316
+
317
+ :param bodystr:
318
+
319
+ :return:
320
+
321
+ """
322
+
323
+ self.body = bodystr
324
+
325
+
326
+
327
+ def make_output(self, timestamp=None):
328
+
329
+ """
330
+
331
+ ヘッダと本文を含めたレスポンス文字列を作る
332
+
333
+ :param timestamp:
334
+
335
+ :return:
336
+
337
+ """
338
+
339
+ import time
340
+
341
+ _weekdayname = ["Mon", "Tue", "Wed", "Thu", "Fri", "Sat", "Sun"]
342
+
343
+ _monthname = [None,
344
+
345
+ "Jan", "Feb", "Mar", "Apr", "May", "Jun",
346
+
347
+ "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"]
348
+
349
+ if timestamp is None:
350
+
351
+ timestamp = time.time()
352
+
353
+ year, month, day, hh, mm, ss, wd, y, z = time.gmtime(timestamp)
354
+
355
+ dtstr = "%s, %02d %3s %4d %02d:%02d:%02d GMT" % (_weekdayname[wd], day, _monthname[month], year, hh, mm, ss)
356
+
357
+ self.set_header("Last-Modified", dtstr)
358
+
359
+ headers = '¥n'.join(["%s: %s" % (k, v)
360
+
361
+ for k, v in self.headers.items()])
362
+
363
+ return headers + '¥n¥n' + self.body
364
+
365
+
366
+
367
+ def __str__(self):
368
+
369
+ """
370
+
371
+ リクエストを文字列に変換する。
372
+
373
+ :return:
374
+
375
+ """
376
+
377
+ return self.make_output().encode('utf-8')
378
+
379
+
380
+
381
+
382
+
383
+ ```