如何修复web.py中'RegisterModel'无'Users'属性及500服务器错误
问题排查:AttributeError: 'RegisterModel' object has no attribute 'Users'
问题描述
使用web.py开发简单Web项目时,用户注册功能触发以下错误,同时返回500 Internal Server Error:
AttributeError: 'RegisterModel' object has no attribute 'Users'
完整报错栈
Traceback (most recent call last): File "C:\Users\Fahim\AppData\Local\Programs\Python\Python38\lib\site-packages\web\application.py", line 280, in process return self.handle() File "C:\Users\Fahim\AppData\Local\Programs\Python\Python38\lib\site-packages\web\application.py", line 271, in handle return self._delegate(fn, self.fvars, args) File "C:\Users\Fahim\AppData\Local\Programs\Python\Python38\lib\site-packages\web\application.py", line 517, in _delegate return handle_class(cls) File "C:\Users\Fahim\AppData\Local\Programs\Python\Python38\lib\site-packages\web\application.py", line 495, in handle_class return tocall(*args) File "F:\Programs\Python\Python 3 Beginner to Advanced\10 Project 5 - Web Development Project Using Web.py\CodeWizard\Controller.py", line 30, in POST reg_model.insert_user(data) File "F:\Programs\Python\Python 3 Beginner to Advanced\10 Project 5 - Web Development Project Using Web.py\CodeWizard\Models\RegisterModel.py", line 15, in insert_user id = self.Users.insert({"username": data.username, "name": data.name, "password": data.password, "email": data.email}) AttributeError: 'RegisterModel' object has no attribute 'Users' 127.0.0.1:13919 - - [28/Nov/2022 01:30:44] "HTTP/1.1 POST /postregistration" - 500 Internal Server Error
相关代码
Register.html
<div class="container"> <h2>Register Account</h2> <br/><br/> <form id="register-form"> <div class="form-group has-info label-static is-empty"> <label for="username" class="control-label">Username</label> <input id="username" name="username" class="form-control" type="text" placeholder="Choose a username"/> </div> <div class="form-group has-info label-static is-empty"> <label for="display_name" class="control-label">Full Name</label> <input id="display_name" name="name" class="form-control" type="text" placeholder="Enter your full name"/> </div> <div class="form-group has-info label-static is-empty"> <label for="email" class="control-label">Email Address</label> <input id="email" name="email" class="form-control" type="email" placeholder="Enter your email"/> </div> <div class="form-group has-info label-static is-empty"> <label for="password" class="control-label">Password</label> <input id="password" name="password" class="form-control" type="password" placeholder="Make a password"/> </div> <button type="submit" class="btn btn-raised btn-info">Submit<div class="ripples-container"></div></button> </form> </div>
RegisterModel.py(原错误代码)
import pymongo from pymongo import MongoClient class RegisterModel: def __int__(self): self.client = MongoClient() self.db = self.client.codewizard self.Users = self.db.users def insert_user(self, data): id = self.Users.insert({"username": data.username, "name": data.name, "password": data.password, "email": data.email}) print("uid is", id)
解决方案
核心问题修正
错误根源是类构造函数拼写错误:Python类的构造函数必须是__init__(双下划线开头和结尾),而你写成了__int__,导致实例化RegisterModel时,初始化逻辑完全没执行,self.Users从未被定义,调用insert_user时自然抛出属性不存在的错误。
修正后的RegisterModel.py代码:
import pymongo from pymongo import MongoClient class RegisterModel: def __init__(self): # 修正构造函数名称 self.client = MongoClient() self.db = self.client.codewizard self.Users = self.db.users def insert_user(self, data): # 额外提示:pymongo 3.x+版本中insert方法已被弃用,推荐使用insert_one id = self.Users.insert_one({"username": data.username, "name": data.name, "password": data.password, "email": data.email}).inserted_id print("uid is", id)
额外优化提示
- pymongo的
insert方法在新版本中已被标记为过时,建议使用insert_one(插入单条数据)或insert_many(插入多条数据),后者会返回包含插入ID的对象,通过.inserted_id可以获取插入文档的ID。 - 确保MongoDB服务正在运行,
MongoClient()默认连接本地27017端口,若你的MongoDB使用了非默认端口或需要认证,需传入对应参数(如MongoClient('mongodb://user:pass@host:port/'))。
内容的提问来源于stack exchange,提问作者Fahim Yusuf
相关产品推荐
相关产品推荐

