Tornado使用Cookie-based seesion来管理user auth,参考文档需要注意以下事项:
1. RequestHandler self.current_user 默认情况是None。
2. 实现用户权限管理,我们需要在你的request handler重写get_current_user()来判断(获得)当前合法用户。
由于Cookie是浏览器选项,用户可以选择禁用Cookie,那该如何判断用户浏览器是否禁用Cookie?
我的思路是在用户第一次request GET的时候,在对应的response中设置一个任意的Cookie值,“checkflag”,这样在接下来的第二次request GET/POST的HTTP Header将包含“Cookie”的信息,禁用Cookied的浏览器在HTTP Headers是不会有“Cookie”信息
我这里根据tornado user authentication 示例代码稍作修改,当用户浏览器禁用Cookie的时候给予一定的提示信息:
import tornado.httpserver
import tornado.ioloop
import tornado.web
class BaseHandler(tornado.web.RequestHandler):
def get_current_user(self):
return self.get_secure_cookie("user")
class MainHandler(BaseHandler):
def get(self):
if not self.current_user:
self.redirect("/login")
return
name = tornado.escape.xhtml_escape(self.current_user)
self.write("Hello, " + name)
class LoginHandler(BaseHandler):
def get(self):
self.set_cookie("checkflag", "true")
self.render("templates/logintest/login.html")
def post(self):
if not self.request.headers.get("Cookie"):
self.render("templates/logintest/require_enable_cookie.html")
return
self.set_secure_cookie("user", self.get_argument("name"))
self.redirect("/")
application = tornado.web.Application([
(r"/", MainHandler),
(r"/login", LoginHandler),
], cookie_secret="hello")
if __name__ == "__main__":
http_server = tornado.httpserver.HTTPServer(application)
http_server.listen(8081)
tornado.ioloop.IOLoop.instance().start()
<html>
<body>
<form action="/login" method="post">
name: <input type="text" name="name"/>
<input type="submit" value="Sign in"/>
</form>
</body>
</html>
Please enable your Cookie option of your browser.
说明:
当首次访问"/"的时候,要求进行用户登录,这里用一个输入框来模拟用户登录,在重定向的"/login" GET对应的response中,提供一个任意“checkflag”cookie值,这样如果用户enable cookie,在下次的http GET/POST请求headers中将会带有“Cookie”信息,否则提供相关的页面信息。
一些Cookie-based session知识:
Cookie-based session 数据是存储在客户端,集群和故障转移是不需要的,在需要的情况下你可以重启servers而不必担心session数据的丢失
Cookie-based session 用户可以访问不同的servers,而不需要被绑定在某一个数据环境(每次的http请求都要求constant querying)
Cookie-based session 只会消耗少量的CPU周期用于校验,任何集中session存储势必会带来一定的瓶颈,即使你保持session data在内存中,这样只会将这些数据绑定在单一的机器上。
Cookie-based session 适用保存一些少量、关键数据,同时需要考虑cookie的一些限制,例如浏览器禁用cookie。
我有试过Gmail,126.com (一些SSL站点)都是需要enable cookie
如果有理解不正确的地方,请大家帮忙予以指正,
分享到:
相关推荐
Python 2.7,离线安装 合集 tornado-4.4.2,python2-backports_abc-0.5-2,python-backports-ssl_match_hostname-3.5.0.1-1,python2-certifi-2016.9.26-2,future-0.15.1.tar.gz,future-0.17.1.tar.gz,python-...
人工智能-项目实践-tornado-基于Tornado实现,系统核心调度,可分布式扩展 修改配置 对settings 里面的配置文件进行修改,主要是数据库 缓存 消息队列 修改 doc/nginx_ops.conf 的server_name 例如 改为 task....
教程:使用Tornado构建,测试和分析高效的微服务 0.获取源代码 获取该教程的源代码: $ git clone https://github.com/scgupta/tutorial-python-microservice-tornado.git $ cd tutorial-python-microservice-...
ubuntu-python3-whisper-tornado docker镜像 Dockerfile
ubuntu-python3-whisper-tornado docker镜像,可下载直接使用
ubuntu-python3-whisper-tornado docker镜像,可下载直接使用
ubuntu-python3-whisper-tornado docker镜像,可下载直接使用
离线安装包,亲测可用
Tornado Web框架是Python中的一个轻量级、高性能的异步网络库,适用于构建可处理大量并发连接的Web应用。Tornado以其非阻塞I/O模型和对WebSockets的良好支持而闻名,是构建实时Web服务的理想选择。 **RESTful API**...
了解这些基础知识后,你可以开始探索 "project_of_tornado" 文件夹,查看具体的代码实现,理解每个文件和模块的作用,学习如何利用 Tornado 构建高效、可扩展的Python后端服务。通过实际操作和调试,你将能更深入地...
官方离线安装包,测试可用。使用rpm -ivh [rpm完整包名] 进行安装
【标题】中的“自我学习笔记--LUA;python:网络编程等”表明这是一份包含LUA和Python语言,特别是关于网络编程的学习资料。LUA和Python都是编程语言,广泛应用于游戏开发、脚本编写、自动化任务以及网络服务等领域。 ...
官方离线安装包,亲测可用。使用rpm -ivh [rpm完整包名] 进行安装
Tornado 和现在的主流 Web 服务器框架(包括大多数 Python 的框架)有着明显的区别:它是非阻塞式服务器,而且速度相当快。得利于其 非阻塞的方式和对 epoll的运用,Tornado 每秒可以处理数以千计的连接,因此 ...