Python服务器端登录脚本获取用户名为空问题求助
登录时用户名被识别为空的问题分析与解决
嘿,我一眼就揪出问题所在了——你的HTML表单和Python脚本里的参数名称不匹配,导致脚本根本拿不到你输入的用户名!
问题根源
先看你的HTML表单里的用户名输入框:
<input type="text" name="uname" id="username" placeholder="USERNAME">
这里的核心属性name是uname,但你的Python脚本里却一直在检查username这个键:
if not 'username' in form_data: print('The username should not be empty')
CGI的FieldStorage是严格根据表单元素的name属性来获取提交参数的,脚本里找不到username这个参数,自然就判定用户名是空的。
两种解决办法(二选一即可)
方案1:修改HTML表单,统一参数名
把用户名输入框的name改成username,和脚本里的键对应上:
<input type="text" name="username" id="username" placeholder="USERNAME">
同时建议给表单补上method="POST"和明确的action路径(指向你的Python脚本),这样更规范:
<form id="registration" action="/cgi-bin/your-login-script.py" method="POST"> <!-- 其他表单元素不变 --> </form>
方案2:修改Python脚本,适配表单参数名
把脚本里的判断和参数匹配逻辑改成用uname:
print('Cache-Control: no-cache') print('Content-type: text/plain; charset=utf-8') print('') import cgi, pickle, hashlib data_file = open('../data/user.dat','rb') data = pickle.loads(data_file.read()) data_file.close() form_data = dict() form = cgi.FieldStorage() for name in form.keys(): if name.lower() == 'userpwd': form_data[name] = hashlib.sha512(form.getfirst(name).encode('utf-8')).hexdigest() else: form_data[name] = form.getfirst(name) # 把判断逻辑里的username改成uname if not 'uname' in form_data: print('The username should not be empty') elif not 'userpwd' in form_data: print('Le mot de pass ne doit pas être vide.') elif form_data['uname'] == data['username'] and form_data['userpwd'] == data['userpwd']: print("Bonjour %s %s !" % (data['firstname'], data['lastname'])) else: print('Le nom d\'utilisateur et le mot de pass sont invalides.')
额外提醒
- 提交登录数据建议用
POST方法,比默认的GET更安全,避免密码出现在URL里; - 打开文件时最好用
with语句,自动处理文件关闭,避免资源泄漏:with open('../data/user.dat','rb') as data_file: data = pickle.loads(data_file.read())
内容的提问来源于stack exchange,提问作者Alesio
相关产品推荐
相关产品推荐

