【问题标题】:empty request body after form submit (Python server, HTML form)表单提交后的空请求正文(Python服务器,HTML表单)
【发布时间】:2018-05-24 03:50:43
【问题描述】:

我目前正在尝试为网站用户构建基于 Web 的身份验证系统。这是我的 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>

通常我希望它向服务器发送一个请求,两个凭据都在请求正文中,所以我的 /auth 路由可以检查它们。但是我使用的 Post-methods 解析器似乎在请求正文中找不到任何内容。这是我的请求解析器(它检查后参数的部分:

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。

【问题讨论】:

  • 不幸的是,如果不了解底层框架的更多信息,我们将无法提供帮助。这是烧瓶吗?姜戈?
  • 是框架中使用的纯python。根本没有任何附加功能。谢谢你的hin,我会更新我的问题!
  • 什么是parse_qsconn 是什么? self.method 是怎么设置的?为什么self.method 支持小写和大写的方法名?
  • 我会将我的请求类的整个实现代码添加到问题中
  • @AlexanderTepe,你是对的 - 你的解析器没有找到数据。表单字段由“name”属性标识,而不是“id”。尝试 注意使用 'name' 属性。

标签: python html web server request


【解决方案1】:

您需要在表单输入上设置name 属性,id 不会识别表单上的输入。

【讨论】:

  • 哎呀,看起来@PakUula 比我更胜一筹,只是在评论中。
猜你喜欢
  • 2017-11-18
  • 2018-03-10
  • 2021-02-22
  • 2018-05-22
  • 1970-01-01
  • 2022-12-07
  • 2021-03-31
  • 2017-10-13
  • 1970-01-01
相关资源
最近更新 更多