顺晟科技
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()。开始()
14
2022-04
29
2021-08
29
2021-08
29
2021-08
28
2021-08
16
2021-06