teratail header banner
teratail header banner
質問するログイン新規登録

質問編集履歴

1

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

2020/06/03 15:53

投稿

NaokiIguchi
NaokiIguchi

スコア0

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
  ```