有时候我们需要判断用户是否进行登录才能继续执行,否则我们就需要用户先进行登录,这时候我们就像需要进行登录的验证。
在tornado中,
在配置中,需要login_url这个配置,当我们未登录时,进行跳转的路由。
'login_url':'/login',
#需要进行验证登录的函数前面加@tornado.web.authenticated
装饰器。最后是调用get_current_user这个方法
因为在继承的RequestHandler这个方法返回的始终是None,因此我们需要重写这个方法。从session取不到user就返回None,取到就返回True。
def get_current_user(self) -> Any:
"""Override to determine the current user from, e.g., a cookie.
This method may not be a coroutine.
"""
return None
因此需要重写:
import tornado.web
from pycket.session import SessionMixin
class TestHandle(SessionMixin,tornado.web.RequestHandler):
def get_current_user(self):
return self.session.get('user')
@tornado.web.authenticated
def get(self):
self.render('account/test.html')
登陆逻辑
class LoginHandle(SessionMixin,tornado.web.RequestHandler):
def get(self):
# username = self.get_cookie('user')
# username = self.get_secure_cookie('user')
username = self.session.get('user')
if username:
self.write('{}登录成功'.format(username))
else:
#进入else,说明没有进行登录,渲染登录页面到浏览器中
self.render('account/login.html')
def post(self):
username = self.get_argument('username','')
password = self.get_argument('password','')
if username == 'root' and password == '123456':
# self.set_cookie('user',username)
# self.set_secure_cookie('user',username)
self.session.set('user',username)
print(username)
print(password)
self.write({'errno':0,'errmsg':'登陆成功'})
else:
#如果用户名和密码不对就重新重定向到登录路由中
self.redirect('/login')
当我们输入
127.0.0.1:8000/test后,会跳转到下面这个路由,也就是登录页面
127.0.0.1:8000/login?next=%2Ftest
登陆成功后就会返回数据:
但是这是我们想要回到我们刚才进入的路由,我们就可以通过next这个查询参数进行获取
这时候登录逻辑:获取next参数,进行跳转。
class LoginHandle(SessionMixin,tornado.web.RequestHandler):
def get(self):
# username = self.get_cookie('user')
# username = self.get_secure_cookie('user')
username = self.session.get('user')
if username:
self.write('{}登录成功'.format(username))
else:
#进入else,说明没有进行登录,渲染登录页面到浏览器中
self.render('account/login.html')
def post(self):
username = self.get_argument('username','')
password = self.get_argument('password','')
next = self.get_argument('next','')
if username == 'root' and password == '123456':
# self.set_cookie('user',username)
# self.set_secure_cookie('user',username)
self.session.set('user',username)
print(username)
print(password)
self.redirect(next)
else:
#如果用户名和密码不对就重新重定向到登录路由中
self.redirect('/login')
登陆完成后,就会跳转到test页面。
我们看到每个需要进行验证的类中都需要重写get_current_user
,
因此可以写一个公共类然后每次都继承这个公共类就不需要每次都重写方法了。
from pycket.session import SessionMixin
import tornado.web
class BaseHandle(SessionMixin,tornado.web.RequestHandler):
def get_current_user(self):
return self.session.get('user')