当我用错误的用户登录时,没有引起错误,SQLITE +龙卷风



我正在使用龙卷风和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只存储用户名)

最新更新