18910140161

tornado与vue.js解决web一对一实时聊天

顺晟科技

2021-06-16 10:29:18

275

记录下这个阶段遇到的一些问题。

解决方案:

前端vue.js ajax

后端django rest框架tornado

用于用户认证的JWT

Redis作为系统缓存

1.前端和后端的认证

1.django api身份验证

Django通过验证http请求头的授权头来进行身份验证。

收到请求时,主要问题如下:

令牌是否真实有效

此令牌代表的用户是的登录吗

令牌将过期多长时间?如果令牌即将过期,请刷新令牌,同时重复刷新几次以防止并发

解决方案

令牌发放的后端接口被截获,/new_token获得的新令牌存储在redis中,/refresh_token获得的刷新令牌也存储在redis中。在获取带有Authorizaion请求头的请求时,首先对令牌进行解码,得到用户名和user_id(注意无论令牌是否无效,基本信息都可以解码),然后在redis中查询only_key,实际上解决了问题1和2。刷新令牌的问题没有特别好的解决方案。相反,refresh_token存储在redis中,如果它已被刷新,则不会再次刷新(以防止重复刷新)。

2.tornado api验证

Tornado在django中没有中间件的概念,认证由python修饰符完成,和django认证一样。

3.vue.js认证

使用router.beforeEach进行全局验证,并在meta中为要验证的页面添加requiresAuth字段。

4.axios身份验证

创建一个新的api.js,创建一个axios实例,在axios的拦截器中添加一个请求头Authorization。因此,api请求存储在api.js中,在组件中使用时,调用相关的promise函数。Axios是异步的,在长池中很容易出现超时中断。这里我要把jquery引入vue,用ajax做长轮询。(有很好的解决方案可以交换)

5.由于浏览器的限制,ajax请求中容易出现cors,跨域请求失败。第三方组件可以直接安装在django,不能安装在tornado。当请求模式为get和partial post时,不会出现cors错误,但当post和dataType为json时,则属于非简单请求,浏览器会自动发送一个选项进行嗅探,看服务器是否支持ip请求。背景是龙卷风:

self . set _ header(' Access-Control-Allow-Origin ',' http://172 . 20 . 10 '). 3:8080

自身设置标题('访问控制-允许-凭证',真)

self.set_header('访问控制-允许-标题',

来源,X-请求者,内容类型,接受,

授权、授权)

自身设置标题('访问控制-允许-方法','发布,获取,放置,删除')

访问控制允许源是前端ip端口号,表示它同意这个ip的非简单请求。

2.tornado处理实时聊天消息

为了处理实时信息,django自己的设备不容易使用。django-channels和websocket虽然可以实现简单的实时通信,但是效果并不好。Tornado是一个异步web框架,处理实时消息,是django的一个组件(这个不太准确,因为tornado的服务器是生产级的服务器,可以直接部署生产,与nginx反向代理相比性能非常出色)。参考tornado中的ajax聊天室演示(脸书工程师的演示,值得一读,可以学习编码规范),redis被用作缓存来处理一对一的消息传递。

三。姜戈和龙卷风的联合部署

官网文档中有相关例子。wsgi是结合tornado的服务器部署的。主要代码如下:

wsgi_app=wsgi。WSGIContainer(

django . core . handlers . wsgi . wsgihandler())

tornado _ app=tornado . web . application(

[

('/api/v1/all-message/',ChatCacheApi。IndexMessageHandler),

('/api/v1/new-message/',ChatCacheApi。NewMessageHandler),

('/api/v1/update-message/',ChatCacheApi。UpdateMessageHandler),

('.*,tornado.web.FallbackHandler,dict(fallback=wsgi_app)),

])

server=tornado . httpserver . httpserver(tornado _ app)

server . listen(options . options . port,' 0.0.0.0 ')

tornado.ioloop.IOLoop.current()。开始()

相关文章
我们已经准备好了,你呢?
2024我们与您携手共赢,为您的企业形象保驾护航