2201_76011792 2023-03-08 12:42 采纳率: 100%
浏览 37
已结题

python服务端报错

在学习一节利用cook营销的课程,这个是写的代码


# cook营销
# coding=utf-8
from http.server import HTTPServer, BaseHTTPRequestHandler
from urllib.parse import parse_qs
from http import cookies
from html import escape as html_escape

form = """
<!DOCTYPE html>

<head>
    <meta charset="utf-8">
    <title>小心,网站正在读取的信息</title>
</head>
<body>
    <p>
        {}
    </p>
<form method="post">
    <label>为了更好的服务,输入你的年龄
    <input type="text" name="yourage">
    </label>
    <br>
    <button type="submit">提交数据</button>
</form>
</body>
"""


class ageHandler(BaseHTTPRequestHandler):
    def do_POST(self):
        length = int(self.headers.get('Content-length', 0))
        data = self.rfile.read(length).decode()
        yourage = parse_qs(data)["yourage"][0]
        c = cookies.SimpleCookie()
        c['yourage'] = yourage
        c['yourage']['domain'] = 'localhost'
        c['yourage']['max-age'] = 100

        self.send_response(303)
        self.send_header('Location', '/')
        self.send_header('Set-Cookie', c['yourage'].OutputString())
        self.end_headers()
        """
        这段代码是一个 Python HTTP 服务器的 do_POST 方法的一部分。
        它从 HTTP 请求中读取 Content-length 头部,然后读取请求正文中的数据。
        然后,它使用 parse_qs 函数从数据中解析出 yourage 参数的值。接下来,
        它创建一个名为 yourage 的 cookie,并将其值设置为从请求中解析出的 yourage 值。
        然后,它设置 cookie 的 domain 和 max-age 属性。最后,它发送一个 303 响应,将 Location 头部设置为 /,
        并使用 Set-Cookie 头部将 cookie 发送回客户端。
        简而言之,这段代码的作用是从 HTTP POST 请求中获取 yourage 参数的值,
        并将其存储在一个 cookie 中,然后将 cookie 发送回客户端。
        """

    def do_GET(self):
        message = "你好,请输入你的年龄"
        if 'cookie' in self.headers:
            try:
                c = cookies.SimpleCookie(self.headers['cookie'])
                age = c["yourage"].values
                if int(age) > 40:
                    message = "大于40岁"
                elif int(age) > 25:
                    message = "大于25岁,小于40"
                else:
                    message = "25岁以下"

            except(KeyError, cookies.CookieError) as e:
                message = "没有找到cook"
                print(e)

        self.send_response(200)
        self.send_header("Content_type", 'text/html;charset=utf-8')
        self.end_headers()

        mesg = form.format(message)
        self.wfile.write(mesg.encode("utf-8"))


if __name__ == '__main__':  # 修改变量名
    server_address = ('', 9999)  # 监听端口
    httpd = HTTPServer(server_address, ageHandler)
    httpd.serve_forever()  # 让程序运行下去

第一次打开网页是可以正常打开的

img


提交数据后,就一直报错,无法打开网页了

img

img

报错内容:TypeError: int() argument must be a string, a bytes-like object or a number, not 'builtin_function_or_method'

不理解的点,报错说int为空,但是我这里是加了异常处理模块的

  • 写回答

2条回答 默认 最新

  • 「已注销」 2023-03-08 12:53
    关注

    “Devil组”引证GPT后的撰写:
    是因为尝试将一个函数或方法对象转换为整数,导致了TypeError: int() argument must be a string, a bytes-like object or a number, not 'builtin_function_or_method'的错误。这可能是因为在以下代码中:

    age = c["yourage"].values
    if int(age) > 40:
    
    
    

    正在尝试将cookie中的值转换为整数,但是age实际上是一个方法对象,而不是字符串或整数。要获得cookie的值,应该调用该方法:

    age = c["yourage"].value
    
    
    

    这里的方法名是value,而不是values,因为只需要cookie中的一个值。更正此错误后,代码应该能够正常运行。

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论 编辑记录
查看更多回答(1条)

报告相同问题?

问题事件

  • 系统已结题 3月16日
  • 已采纳回答 3月8日
  • 修改了问题 3月8日
  • 创建了问题 3月8日

悬赏问题

  • ¥500 亚马逊 COOKIE我如何才能实现 登录一个亚马逊账户 下发新 COOKIE ..我使用下发新COOKIE 导入ADS 指纹浏览器登录,我把账户密码 修改过后,原来下发新COOKIE 不会失效的方式
  • ¥20 玩游戏gpu和cpu利用率特别低,玩游戏卡顿
  • ¥25 oracle中的正则匹配
  • ¥15 关于#vscode#的问题:把软件卸载不会再出现蓝屏
  • ¥15 vimplus出现的错误
  • ¥15 usb无线网卡转typec口
  • ¥30 怎么使用AVL fire ESE软件自带的优化模式来优化设计Soot和NOx?
  • ¥15 Ubuntu20.04.4.LTS系统如何下载安装VirtualBox虚拟机?
  • ¥15 如何用QDomDocument读取内容为空格的xml数据
  • ¥15 请阅读下面代码,帮我修改下代码