authenticated是tornado自带的登录验证装饰器,它的实现比较简单,验证比较简易,无法做到真正意义的前后端分离并且是同步的方式,所以这里我对它进行了重写,以适应异步JWT方式的登录验证。

Tornado自带的authenticated源码:
def authenticated(method):
@functools.wraps(method)def wrapper(self, *args, **kwargs):if not self.current_user:if self.request.method in ("GET", "HEAD"):url = self.get_login_url()if "?" not in url:if urlparse.urlsplit(url).scheme:# if login url is absolute, make next absolute toonext_url = self.request.full_url()else:next_url = self.request.uriurl += "?" + urlencode(dict(next=next_url))self.redirect(url)returnraise HTTPError(403)return method(self, *args, **kwargs)return wrapperdef get_login_url(self):"""Override to customize the login URL based on the request.By default, we use the ``login_url`` application setting."""self.require_setting("login_url", "@tornado.web.authenticated")return self.application.settings["login_url"]def redirect(self, url, permanent=False, status=None):if self._headers_written:raise Exception("Cannot redirect after headers have been written")if status is None:status = 301 if permanent else 302else:assert isinstance(status, int) and 300 <= status <= 399self.set_status(status)self.set_header("Location", utf8(url))self.finish()

从源码可以看出,authenticated的作用:当current_user不存在时,它会调用get_login_url方法从settings里面去取login_url,从而获取user返回,当user未登录时,它会调用redirect重定向,返回301。

改写步骤:1.将同步的方法使用协程改写2.以JWT的方式校验用户token,用户不存在或token已过期直接返回状态码,限制继续访问接口

实现代码:
 1 def authenticated(func):
 2     """
 3     重写tornado authenticated
 4     :param func:
 5     :return:
 6     """
 7
 8     async def wrapper(self, *args, **kwargs):
 9         res_data = {}
10         token = self.request.headers.get("token")
11         if token:
12             try:
13                 send_data = jwt.decode(
14                     token, self.settings["secret_key"],
15                     leeway=self.settings["jwt_expire"],
16                     options={"verify_exp": True}
17                 )
18                 user_id = send_data["id"]
19
20                 # 从数据库中获取到user并设置给_current_user
21                 try:
22                     user = await self.application.objects.get(
23                         User, id=user_id
24                     )
25                     self._current_user = user
26
27                     result = await func(self, *args, **kwargs)
28                     return result
29                 except User.DoesNotExist:
30                     res_data["content"] = "用户不存在"
31                     self.set_status(401)
32             except Exception as e:
33                 print(e)
34                 self.set_status(401)
35                 res_data["content"] = "token不合法或已过期"
36         else:
37             self.set_status(401)
38             res_data["content"] = "缺少token"
39
40         self.write(res_data)
41
42     return wrapper

请求接口的时候在headers里面带上token即可登录验证,测试如下:

 

转载于:https://www.cnblogs.com/FG123/p/10013564.html

Tornado之异步authenticated相关推荐

  1. [翻译]深入理解Tornado——一个异步web服务器

    本人的第一次翻译,转载请注明出处:http://www.cnblogs.com/yiwenshengmei/archive/2011/06/08/understanding_tornado.html ...

  2. Python Web框架Tornado的异步处理代码演示样例

    1. What is Tornado Tornado是一个轻量级但高性能的Python web框架,与还有一个流行的Python web框架Django相比.tornado不提供操作数据库的ORM接口 ...

  3. tornado的异步效果

    第一种方式:import tornado.ioloop import tornado.web from tornado import gen from tornado.concurrent impor ...

  4. tornado实现异步非阻塞

    1.使用 tornado.gen.coroutine 异步编程(需要第三方库支持tornado异步) 同步阻塞 code # coding=utf-8 # @Time : 2020/11/3 15:4 ...

  5. 关于tornado的异步耗时操作假设

    tornado 如果遇到耗时的操作,可不可以这样 把耗时操作放在一个由 python进程池维护的 pool中, 用 webapi封装起来, 然后tornado 接收客户端请求后,遇到耗时操作就 与访问 ...

  6. python异步处理请求_python:tornado+wsgi异步处理请求

    tornado版本: start_app.py # coding:gbk import tornado.web import tornado.wsgi import wsgiref.simple_se ...

  7. python同步异步_python中Tornado的同步与异步I/O的介绍(附示例)

    本篇文章给大家带来的内容是关于python中Tornado的同步与异步I/O的介绍(附示例),有一定的参考价值,有需要的朋友可以参考一下,希望对你有所帮助. 协程是Tornado种推荐的编程方式,使用 ...

  8. 真正的 Tornado 异步非阻塞

    其中 Tornado 的定义是 Web 框架和异步网络库,其中他具备有异步非阻塞能力,能解决他两个框架请求阻塞的问题,在需要并发能力时候就应该使用 Tornado. 但是在实际使用过程中很容易把 To ...

  9. 《Introduction to Tornado》中文翻译计划——第五章:异步Web服务

    http://www.pythoner.com/294.html 本文为<Introduction to Tornado>中文翻译,将在https://github.com/alioth3 ...

最新文章

  1. linux下模拟CPU占用100%小程序
  2. IIS发布网页的基本操作
  3. gitlab合并分支后需要提交吗_gitlab使用总结
  4. AutoMapper2
  5. Redis面试题详解
  6. 碎玻璃:诊断生产Cassandra问题
  7. [Grid Layout] Place grid items on a grid using grid-column and grid-row
  8. 看看这帮猴子的伪原创工具
  9. 非常漂亮的后台登录页面
  10. Node概述_note
  11. 4/2上海DevDays2004
  12. oracle 等待sql,oracle sql 锁,锁等待相关sql
  13. 模拟 之 zoj 3818 Pretty Poem
  14. 如何给硬盘分1T整数的空间
  15. LaTeX下载安装-1
  16. html5 p 字号,五号字是多少pt?
  17. Processing 入门教程(二十一) 利用数组产生雪花坠落效果
  18. 获取Angular中的AngularJS功能
  19. vgg19.npy下载
  20. android屏幕唤醒与解锁

热门文章

  1. windows使用git clone速度慢,改善方法
  2. 爬取人力资源社保局咨询问题
  3. 相机技术公司Lytro获6000万美元D轮融资,阿里巴巴参投
  4. 编程语言和shell编程的基础内容以及grep、egrep命令及相应的正则表达式和用法...
  5. Java - 经常使用函数Random函数
  6. (转) Deep Learning Resources
  7. 【Android】3.24 示例24--OpenGL绘制功能
  8. 斐波那契序列 Fibonacci
  9. python写二进制大文件,如何将文件写入二进制文件,或在大文件中编辑单行– Python...
  10. matlab 信道模拟 差错概率,移动信道差错序列的分布概率模拟法及门限电平的讨论...