我正在使用龙卷风和SQLITE开发一个简单的登录应用程序。当我登录应用程序时,应用程序执行了我所期望的操作,用户被重定向到他的路由https://some_url/user_n。当我给出错误的凭据时,我的问题就出现了,在这里被重定向到登录区域https://some_url/login,并引发一个自定义错误消息,我得到了一个500通用错误页面。到目前为止,我已经尝试了所有的方法,但我对python和Tornado服务器都是一种"全新的"。
下面,你可以看到我的代码:import tornado
from tornado.web import RequestHandler
import sqlite3
# could define get_user_async instead
def get_user(request_handler):
return request_handler.get_cookie("user")
# could also define get_login_url function (but must give up LoginHandler)
login_url = "/login"
# Initialize SQLITE3 parameters
db_file = "user_login.db"
connection = None
cursor = None
# optional login page for login_url
class LoginHandler(RequestHandler):
def get(self):
try:
errormessage = self.get_argument("error")
except Exception:
errormessage = ""
self.render("login.html", errormessage=errormessage)
def check_permission(self, username, password):
connection = sqlite3.connect(db_file)
cursor = connection.cursor()
cursor.execute(
"SELECT * FROM users WHERE username=? AND password=?", (username, password)
)
data = cursor.fetchone()
if username == data[1] and password == data[2]:
return True
return False
def post(self):
username = self.get_argument("username", "")
password = self.get_argument("password", "")
auth = self.check_permission(username, password)
if auth:
self.set_current_user(username)
self.redirect(self.get_argument("next", f"/{username}"))
else:
error_msg = "?error=" + tornado.escape.url_escape("Login incorrect.")
self.redirect(login_url + error_msg)
def set_current_user(self, user):
if user:
self.set_cookie("user", tornado.escape.json_encode(user), expires_days=None)
else:
self.clear_cookie("user")
# class DashboardHandler(RequestHandler):
# def post(self, *arg, **kwargs):
# user_from_URL = kwargs["user_id"]
# user_from_cookie = self.get_cookie("user", "")
# # do_some_permission_check()
# if user_from_URL != user_from_cookie:
# self.redirect(self.get_argument("next", f"/{user_from_cookie}"))
# optional logout_url, available as curdoc().session_context.logout_url
logout_url = "/logout"
# optional logout handler for logout_url
class LogoutHandler(RequestHandler):
def get(self, username):
username = self.current_user
self.clear_cookie(username)
self.redirect(self.get_argument("next", "/login"))
错误发生在check_permission
方法中-您正在从数据库中获取不存在的记录。这意味着在数据库中不存在用户名/密码对的情况下,data = cursor.fetchone()
将data
的值设置为None
,但是您尝试然后在下一行中获得data[0]
,TypeError: 'NoneType' object is not subscriptable
死亡,这反过来触发500错误页。
要修复问题中的错误,你应该将这行修改为:
if data and username == data[1] and password == data[2]:
但实际上你应该做更多你不应该做的事情:
- 在数据库中存储明文密码(使用加盐哈希)
- 使用set_cookie存储用户数据(使用set_secure_cookie只存储用户名)