私は現在、ウェブサイトのユーザー向けにWebベースの認証システムを構築しようとしています。これは私のHTMLログインフォームです:フォームリクエスト後に空のリクエストボディ(Pythonサーバー、HTMLフォーム)
<form action="/auth" method="post" class="pure-form pure-form-stacked">
<fieldset>
<legend>Login</legend>
<label for="username">Username</label>
<input id="username" type="username" placeholder="Username">
<label for="password">Password</label>
<input id="password" type="password" placeholder="Password">
<button type="submit" class="pure-button pure-button-primary">
Login
</button>
</fieldset>
</form>
は通常、私はそれは、リクエストボディの内側の両方資格情報を使用して、サーバーにリクエストを送信するために期待していたので、私の/認証ルートは、それらを確認することができます。しかし、私が使っているPostメソッドのパーサーは、リクエストボディの中に何も見つからないようです。私はコードの重要な通路にいくつかのトレース出力を追加しました
class Request:
"""
http request data.
"""
def __init__(self):
self.headers = {}
self.method = None
self.protocol = None
self.resource = None
self.path = None
self.params = {}
self.origin = None # will be set from server
def parse(self, conn):
"""Parses an http-Request and return a dictionary with process_request line values and headers."""
self.headers = {}
# read process_request line
request_line = conn.readline().decode('utf-8').strip()
log(1, "Request-Line: %s" % request_line)
if not request_line: # rfc says "server SHOULD ignore blank request lines"
return None
# parse process_request line
try:
self.method, self.resource, self.protocol = request_line.split(" ")
except ValueError:
raise StopProcessing(400, "Bad request-line: %s\n" % request_line)
# parse resource to path and params
# extract GET parameters
from urllib.parse import urlparse, parse_qs # analyse urls and parse query strings
requrl = urlparse(self.resource)
self.path = requrl.path
self.params.update(parse_qs(requrl.query))
# read and parse Request-Headers
while True:
header_line = conn.readline().decode('utf-8').strip()
if not header_line:
break
log(2, "Header-Line: " + header_line)
(headerfield, headervalue) = header_line.split(":", 1)
self.headers[headerfield.strip()] = headervalue.strip()
# read cookies
if 'Cookie' in self.headers:
log(2, "Cookie ist: %s" % self.headers['Cookie'])
self.cookies = Cookie.parse(self.headers['Cookie'])
else:
self.cookies = {}
# parse POST parameters
log(1,"Methode %s" % self.method)
if self.method == 'POST' or self.method == 'post':
postbody = conn.read(int(self.headers['Content-Length'])).decode('utf-8')
self.params.update(parse_qs(postbody))
# all parameter values are lists
# replace lists by the only element if there is only one
for key in self.params:
if len(self.params[key])==1:
self.params[key] = self.params[key][0]
return self.headers
と私が見つけた私のパーサは常に空を返したことだった:これは私の要求パーサー(それは後のパラメータをチェックし、それの一部であります辞書{}。 私は何をしないのですか?何のアドオン全くこのフレームワークで使用されるものではなく 。それは純粋なPythonのである。
残念ながら、もう少し詳しく知ることなく基本的なフレームワークでは、私たちは手助けできません。このフラスコですか? Django? – cwallenpoole
それはフレームワークで使用される純粋なpythonです。アドオンは全くありません。 hinのおかげで、私は私の質問を更新する! –
'parse_qs'とは何ですか? 'conn'とは何ですか? 'self.method'はどのように設定されていますか?なぜself.methodは小文字と大文字のメソッド名をサポートしていますか? – cwallenpoole