Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >用户验证

用户验证

作者头像
星哥玩云
发布于 2022-09-14 11:00:20
发布于 2022-09-14 11:00:20
94000
代码可运行
举报
文章被收录于专栏:开源部署开源部署
运行总次数:0
代码可运行

一、说明

用户验证是指在收到用户请求后进行处理前先判断用户的认证状态(如登陆状态),若通过验证则正常处理,否则强制用户跳转至认证页面(如登陆页面)

二、authenticated装饰器

说明

为了使用Tornado的认证功能,我们需要对登录用户标记具体的处理函数。我们可以使用@tornado.web.authenticated装饰器完成它。当我们使用这个装饰器包裹一个处理方法时,Tornado将确保这个方法的主体只有在合法的用户被发现时才会调用

示例

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<span class="hljs-class"><span class="hljs-keyword">class</span> <span class="hljs-title">ProfileHandler</span><span class="hljs-params">(RequestHandler)</span>:</span>
<span class="hljs-meta">    @tornado.web.authenticated</span>
    <span class="hljs-function"><span class="hljs-keyword">def</span> <span class="hljs-title">get</span><span class="hljs-params">(self)</span>:</span>
        self.write(<span class="hljs-string">"这是我的个人主页。"</span>)

三、get_current_user()方法

说明:

装饰器@tornado.web.authenticated的判断执行依赖于请求处理类中的self.current_user属性,如果current_user值为假(None、False、0、""等),任何GET或HEAD请求都将把访客重定向到应用设置中login_url指定的URL,而非法用户的POST请求将返回一个带有403(Forbidden)状态的HTTP响应

在获取self.current_user属性的时候,tornado会调用get_current_user()方法来返回current_user的值。也就是说,我们验证用户的逻辑应写在get_current_user()方法中,若该方法返回非假值则验证通过,否则验证失败

示例

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<span class="hljs-class"><span class="hljs-keyword">class</span> <span class="hljs-title">ProfileHandler</span><span class="hljs-params">(RequestHandler)</span>:</span>
    <span class="hljs-function"><span class="hljs-keyword">def</span> <span class="hljs-title">get_current_user</span><span class="hljs-params">(self)</span>:</span>
        <span class="hljs-string">"""在此完成用户的认证逻辑"""</span>
        user_name = self.get_argument(<span class="hljs-string">"name"</span>, <span class="hljs-keyword">None</span>)
        <span class="hljs-keyword">return</span> user_name 

<span class="hljs-meta">    @tornado.web.authenticated</span>
    <span class="hljs-function"><span class="hljs-keyword">def</span> <span class="hljs-title">get</span><span class="hljs-params">(self)</span>:</span>
        self.write(<span class="hljs-string">"这是我的个人主页。"</span>)

四、login_url 设置

说明

用户验证失败时,将用户重定向到login_url上,所以我们还需要在Application中配置login_url

示例

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<span class="hljs-class"><span class="hljs-keyword">class</span> <span class="hljs-title">LoginHandler</span><span class="hljs-params">(RequestHandler)</span>:</span>
    <span class="hljs-function"><span class="hljs-keyword">def</span> <span class="hljs-title">get</span><span class="hljs-params">(self)</span>:</span>
        <span class="hljs-string">"""在此返回登陆页面"""</span>
        self.write(<span class="hljs-string">"登陆页面"</span>)

app = tornado.web.Application(
    [
        (<span class="hljs-string">r"/"</span>, IndexHandler),
        (<span class="hljs-string">r"/profile"</span>, ProfileHandler),
        (<span class="hljs-string">r"/login"</span>, LoginHandler),
    ],
    <span class="hljs-string">"login_url"</span>:<span class="hljs-string">"/login"</span>
)

结果:

next 参数跳转

在login_url后面补充的next参数就是记录的跳转至登录页面前的所在位置,所以我们可以使用next参数来完成登陆后的跳转

示例

修改登陆逻辑

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<span class="hljs-class"><span class="hljs-keyword">class</span> <span class="hljs-title">LoginHandler</span><span class="hljs-params">(RequestHandler)</span>:</span>
    <span class="hljs-function"><span class="hljs-keyword">def</span> <span class="hljs-title">get</span><span class="hljs-params">(self)</span>:</span>
        <span class="hljs-string">"""登陆处理,完成登陆后跳转回前一页面"""</span>
        next = self.get_argument(<span class="hljs-string">"next"</span>, <span class="hljs-string">"/"</span>)
        self.redirect(next+<span class="hljs-string">"?name=logined"</span>)

用户访问的网址顺序:

完整代码

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<span class="hljs-keyword">import</span> tornado.web,os
<span class="hljs-keyword">import</span> tornado.ioloop
<span class="hljs-keyword">import</span> tornado.httpserver
<span class="hljs-keyword">from</span> tornado.web <span class="hljs-keyword">import</span> RequestHandler


<span class="hljs-class"><span class="hljs-keyword">class</span> <span class="hljs-title">ProfileHandler</span><span class="hljs-params">(RequestHandler)</span>:</span>
    <span class="hljs-function"><span class="hljs-keyword">def</span> <span class="hljs-title">get_current_user</span><span class="hljs-params">(self)</span>:</span>
        <span class="hljs-string">"""在此完成用户的认证逻辑"""</span>
        user_name = self.get_argument(<span class="hljs-string">"name"</span>, <span class="hljs-keyword">None</span>)
        <span class="hljs-keyword">return</span> user_name

<span class="hljs-meta">    @tornado.web.authenticated</span>
    <span class="hljs-function"><span class="hljs-keyword">def</span> <span class="hljs-title">get</span><span class="hljs-params">(self)</span>:</span>
        <span class="hljs-comment"># 获取当前用户</span>
        print(self.current_user)
        self.write(<span class="hljs-string">"这是我的个人主页。"</span>)


<span class="hljs-class"><span class="hljs-keyword">class</span> <span class="hljs-title">LoginHandler</span><span class="hljs-params">(RequestHandler)</span>:</span>
    <span class="hljs-function"><span class="hljs-keyword">def</span> <span class="hljs-title">get</span><span class="hljs-params">(self)</span>:</span>
        <span class="hljs-string">"""在此返回登陆页面"""</span>
        self.write(<span class="hljs-string">"登陆页面"</span>)


<span class="hljs-keyword">if</span> __name__ == <span class="hljs-string">"__main__"</span>:
    app = tornado.web.Application([
        (<span class="hljs-string">r"/profile"</span>, ProfileHandler),
        (<span class="hljs-string">r"/login"</span>, LoginHandler),
    ],
        login_url=<span class="hljs-string">"/login"</span>,
        debug=<span class="hljs-keyword">True</span>,
        autoreload=<span class="hljs-keyword">True</span>,
        template_path=os.path.join(os.path.dirname(__file__),<span class="hljs-string">'templates'</span>),
    )
    http_server = tornado.httpserver.HTTPServer(app)
    http_server.listen(<span class="hljs-number">8000</span>)
    tornado.ioloop.IOLoop.current().start()
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
cookie操作
set_cookie(name, value, domain=None, expires=None, path=’/’, expires_days=None)
星哥玩云
2022/09/14
5180
cookie操作
模型继承与对应关系
在一对多关系基础上的父表中使用backref函数,并添加uselist参数来表示一对一关系
星哥玩云
2022/09/14
1.4K0
增加数据到数据库
一、创建对象 当创建对象时DJango没有操作数据库读写,当调用save()方法时才与数据库进行交互,将对象保存到数据库 __init__()方法已经在models.Model类中进行了重写规定了特殊含义,所以在模型类中不能重写 二、增加方式 对象创建空对象后赋值 u = User() <span class="hljs-comment"># 实例化User模型类</span> u.username = <span class="hljs-string">'lucky'</span> <span clas
星哥玩云
2022/09/14
6840
会话控制 COOKIE 与 SESSION
会话控制 用来保持用户的状态 具体来说cookie机制采用的是在客户端保持状态的方案,而session机制采用的是在服务器端保持状态的方案
星哥玩云
2022/09/14
3980
Tornado(cookie、XSRF、用户验证)
——————–Cookie操作——————– 1、设置Cookie 1、set_cookie(name,value,domain=None,expires=None,path=”/”)
全栈程序员站长
2022/08/31
7760
IO异步
对于耗时的过程,我们将其交给别人(如其另外一个线程)去执行,而我们继续往下处理,当别人执行完耗时操作后再将结果反馈给我们,这就是我们所说的异步
星哥玩云
2022/09/14
5280
应用上下文
一、app对象 说明 全局应用对象 作用 加载配置 关联三方对象 注册蓝图 启动项管理 公共的全局的配置可以加载到该对象上 定义一些全局数据 需求 系统最多支持100个用户 公共配置 app.MAX_USER_NUM = <span class="hljs-number">100</span> <span class="hljs-class"><span class="hljs-keyword">class</span> <span class="hljs-title">DefaultConfig</spa
星哥玩云
2022/09/14
2340
flask扩展 flask-celery
一、flask-celery安装 pip install celery pip install redis==2.10.6 pip install flask-celery-helper 二、创建和加载 工程目录下创建run_celery.py文件 <span class="hljs-comment">#定义创建celery对象的方法</span> <span class="hljs-keyword">from</span> celery <span class="hljs-keyword">import<
星哥玩云
2022/09/14
2700
面向对象-访问限制
使用@property让私有属性可以使用点语法。但本质上还是调用公有方法访问的私有属性,只不过看起来比较美丽
星哥玩云
2022/09/08
1.1K0
后台管理-xadmin
在Python终端输入命令help(‘xadmin’) 查看xadmin安装位置 得到如下输出
星哥玩云
2022/09/14
6.4K0
后台管理-xadmin
点赞模块设计 - Redis缓存 + 定时写入数据库实现高性能点赞功能
源码地址:https://github.com/cachecats/coderiver
solocoder
2022/04/06
2.3K0
点赞模块设计 - Redis缓存 + 定时写入数据库实现高性能点赞功能
相关推荐
cookie操作
更多 >
领券
💥开发者 MCP广场重磅上线!
精选全网热门MCP server,让你的AI更好用 🚀
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验