之前的时候一直用的flask做后端的,只是用了后发现他是阻塞式的,对比了一下sanic后果断的换了sanic。说实话用flask的确是很方便。什么东西拿来就用的。登陆管理有Login模块,很方便。但是选择了sanic就选择了自己造轮子了。
我的后端用的是golang和sanic所有的api请求全部放到golang里面,实际上sanic的角色就是主要的逻辑判断和模板渲染。毕竟golang的处理能力和Python相比要强得多。这样把主要的负载放到golang里面就不用担心sanic了。当然sanic和golang是共享登录状态的。今天总结一下大概的。
登陆状态管理:参考了github的一个别人的小demo然后自己用flask的思路实现了,flask的@auth.login_required,logout,
is_authenticated,is_anonymous,current_user目前主要用到的是这几个,登录状态是基于redis存储的不是cook保存。角色权限这一块目前还没有去做后面会慢慢完善。
用户邮箱激活:这一块也是基于flask的思路来做的不同的是用的异步方式。主要思路是注册后异步发邮件后发一条加密后的连接给用户邮箱。点击连接访问激活路由的时候进行解密验证,当然加密的东西必须和这个用户的资料相关,因为解密后核对的时候和用户的资料某个字段对比,过期时间就很简单了,加密时候加一个时间戳进去,解密后会得到一个用户资料某个字段和一个时间戳,和当前时间对比,超过多久就过期判断一下过期了就不给激活abort(404)就可以了
用户注册登陆账号密码前后端的加密传输加密保存:这里最重要的实际就是前后端要采用一样的加密解密方式其实没有什么难度。
基于redis的用户请求token的存储验证:这个有一个现成的sanic的session库可以实现session在github就可以找到,我这里主要是和golang要共享session和token验证。所以我的思路是token的加密解密全部放go里面,sanic需要验证token的时候也是用iohttp这个包取请求,基本上所有的需要用到CPU密集型的处理我全部放到go里面了。主要不会对sanic产生压力了。
基于froala_editor编辑器的图片上传鉴权验证保存:这个编辑器很好用但是只有针对dDjango和flask的sdk没有针对sanic的因为sanic是异步的,所以这个就是完全在flask的sdk的基础上自己改的。目前完全支持sanic,主要是要修改里面的同步逻辑代码改成异步的就可以了
用nginx做跳转的图片重定向:主要作用是我们对于图片的url重定向,比如请求的用户私人图片路径是/statick/prv/xxxxxxuseruid/1234.jpg这里xxxx是用户的uid定义的一个目录文件夹,里面放的是用户私人的图片也就是别人无法访问的,用户公开的图片路径是/statick/pub/5678.jpg,这里是所有用户可见的图片,但是我们需要把所有的图片路径统一成/upload/1234.jpg, /upload/5678.jpg,统一成这样然后在这个路由里面做鉴权和真是路径判断然后输出给nginx,由于nginx是网站第一道门这样就可以保护我们真实地目录结构,他接受访问图片的地址永远是/upload/xxxxx。jpg,这个功能还不错,还有就是试想一下我们把所有图片用真是路径写到代码里面了包括前端的,但是对于后期如果有目录结构调整的话我们傻眼了,用这个重定向我们很方便,只需要修改这个路由里面就可以,
基于gensim的重复垃圾信息自动审核:这个主要就是判断一篇文章的相似度超过阈值就审核状态为待审核然后转人工审核,一般的垃圾信息很多是打了重复内容乱发这个自动审核会很有用。
基于keywordtree的敏感字过滤:这个主要是自动审核文字内容的敏感字,他会把所有包含在敏感字库里面的词组都检索出来,速度超快,可能底层是用c写的,我试了一下几千字基本就是0.001秒就给出结果了。准确率很高。我们可以根据这个来更新审核状态到人工,通过的就可以直接转审核通过了。
基于Yahoo的AI开源模型open_nsfw的图片自动审核:这里我是直接把它做成一个api然后用一个单独的sanic的app来运行处理,因为底层是c写的我们也不用担心底层效率,不过速度有点慢一张图片的审核时间大概是3--5秒。不过我用的并行审核,一次处理10张图片的话就基本可以把平均效率拉低到平均大约2,5秒左右处理一张。判断结果我们可以定阈值,对于超过.8分的就可以认定是敏感图可以pass掉,对于低于.2分的可以认定正常图片直接通过。对于中间值的可以转人工审核,这里其实是主要减低人工工作量
基于rabbitmq的其他需要通过队列处理的事件:这里也是为了减轻sanic的负载。对于一些队列任务比如push用户消息之类的。
把aioredis和aiomysql的线程池包装成上下文管理器:这样在使用的时候直接在上下文管理器里面操作不用每次去关闭资源,可能他的线程池里面有对自语昂立的自动回收,但是你用压测的跑一下就会发现,会有很多未关闭的资源,也许是他的回收机制有一个时间阀吧,具体我没有深入研究了
对于前端输入文本的xss过滤:是参考了github的一个小demo做的主要是过滤xss攻击的。当然前端也会做过滤。froala_editor这个编辑器的cleanHtml的功能很好用可以直接包装成一个函数在任何js里面使用了。
我的前端用的是vue和jq的结合:需要数据处理能够绑定数据的全部用vue,只有在不得已的时候只能用jq去操作dom了。我觉得没有必要非要说只用哪一个或者哪一种。我们的目的是实现需求,能够用最省力的方式实现需求的都是好方法。
目前技术栈主要是Python,go,JavaScript,vue,如果有共同兴趣的小伙伴可以一起探讨研究一下。我的微信是WFpHMTY4MTc4(base64一下)