質問編集履歴
1
httphandler.pyについてコードを掲載しました。
title
CHANGED
File without changes
|
body
CHANGED
@@ -76,4 +76,117 @@
|
|
76
76
|
res.set_body(get_htmltemplate() % body)
|
77
77
|
print(res)
|
78
78
|
|
79
|
+
```
|
80
|
+
|
81
|
+
### httphandler.pyについて
|
82
|
+
|
83
|
+
httphandlerは以下の様なコードになります。
|
84
|
+
|
85
|
+
```Python Console
|
86
|
+
# 標準モジュールをimportする。
|
87
|
+
import cgi
|
88
|
+
import os
|
89
|
+
|
90
|
+
|
91
|
+
class Request(object):
|
92
|
+
"""
|
93
|
+
HTTPのリクエストをハンドリングするクラスです。
|
94
|
+
CGI側でインスタンスを生成することによって利用する
|
95
|
+
クエリデータや環境変数へのアクセス、主要ヘッダへの
|
96
|
+
アクセス用メソッドを提供します。
|
97
|
+
"""
|
98
|
+
|
99
|
+
def __init__(self, environ=os.environ):
|
100
|
+
"""
|
101
|
+
インスタンスの初期化メソッド
|
102
|
+
クエリ、環境変数をアトリビュートとして保持する。
|
103
|
+
"""
|
104
|
+
self.form = cgi.FieldStorage()
|
105
|
+
self.environ = environ
|
106
|
+
|
107
|
+
|
108
|
+
def get_htmltemplate():
|
109
|
+
"""
|
110
|
+
レスポンスとして返すHTMLのうち,定型部分を返す
|
111
|
+
"""
|
112
|
+
html_body = u"""
|
113
|
+
<html>
|
114
|
+
<head>
|
115
|
+
<meta http-equiv="content-type"
|
116
|
+
content="text/html;charset=utf-8" />
|
117
|
+
</head>
|
118
|
+
<body>
|
119
|
+
%s
|
120
|
+
</body>
|
121
|
+
</html>"""
|
122
|
+
return html_body
|
123
|
+
|
124
|
+
|
125
|
+
class Response(object):
|
126
|
+
"""
|
127
|
+
HTTPのレスポンスをハンドリングするクラスです。
|
128
|
+
レスポンスを送信する前にインスタンスを生成して利用します。
|
129
|
+
レスポンスやヘッダの内容を保持し、ヘッダを含めたレスポンスの
|
130
|
+
送信を行います。
|
131
|
+
"""
|
132
|
+
|
133
|
+
def __init__(self, charset='utf-8'):
|
134
|
+
self.headers = {'Content-type': 'text/html;charset=%s' % charset}
|
135
|
+
self.body = ""
|
136
|
+
self.status = 200
|
137
|
+
self.status_message = ''
|
138
|
+
|
139
|
+
def set_header(self, name, value):
|
140
|
+
"""
|
141
|
+
レスポンスのヘッダを設定する。
|
142
|
+
:param name:
|
143
|
+
:param value:
|
144
|
+
:return:
|
145
|
+
"""
|
146
|
+
self.headers[name] = value
|
147
|
+
|
148
|
+
def get_header(self, name):
|
149
|
+
"""
|
150
|
+
設定済みのレスポンス用ヘッダを返す
|
151
|
+
:param name:
|
152
|
+
:return:
|
153
|
+
"""
|
154
|
+
return self.headers.get(name, None)
|
155
|
+
|
156
|
+
def set_body(self, bodystr):
|
157
|
+
"""
|
158
|
+
レスポンスとして出力する本文の文字列を返す
|
159
|
+
:param bodystr:
|
160
|
+
:return:
|
161
|
+
"""
|
162
|
+
self.body = bodystr
|
163
|
+
|
164
|
+
def make_output(self, timestamp=None):
|
165
|
+
"""
|
166
|
+
ヘッダと本文を含めたレスポンス文字列を作る
|
167
|
+
:param timestamp:
|
168
|
+
:return:
|
169
|
+
"""
|
170
|
+
import time
|
171
|
+
_weekdayname = ["Mon", "Tue", "Wed", "Thu", "Fri", "Sat", "Sun"]
|
172
|
+
_monthname = [None,
|
173
|
+
"Jan", "Feb", "Mar", "Apr", "May", "Jun",
|
174
|
+
"Jul", "Aug", "Sep", "Oct", "Nov", "Dec"]
|
175
|
+
if timestamp is None:
|
176
|
+
timestamp = time.time()
|
177
|
+
year, month, day, hh, mm, ss, wd, y, z = time.gmtime(timestamp)
|
178
|
+
dtstr = "%s, %02d %3s %4d %02d:%02d:%02d GMT" % (_weekdayname[wd], day, _monthname[month], year, hh, mm, ss)
|
179
|
+
self.set_header("Last-Modified", dtstr)
|
180
|
+
headers = '¥n'.join(["%s: %s" % (k, v)
|
181
|
+
for k, v in self.headers.items()])
|
182
|
+
return headers + '¥n¥n' + self.body
|
183
|
+
|
184
|
+
def __str__(self):
|
185
|
+
"""
|
186
|
+
リクエストを文字列に変換する。
|
187
|
+
:return:
|
188
|
+
"""
|
189
|
+
return self.make_output().encode('utf-8')
|
190
|
+
|
191
|
+
|
79
192
|
```
|