使用flask_restful+redis快速搭建简单API服务

Posted dogcraft

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了使用flask_restful+redis快速搭建简单API服务相关的知识,希望对你有一定的参考价值。

快没有存货了……


最近对 API 服务开始有了兴趣,于是用 flaskre­dis 做了一个玩一玩,同时也学习一下 API 服务的搭建与通过 javascript 调用方法。


做出来的成果在 https://www.dogcraft.top/xxjj/。这个是完全采用前后端分离搞出来的,前端完全是静态 htmlJavaScript,后端的 flask 不提供任何页面,只通过 json 传递数据。还同时搞了一个简单的后台管理页面,同样是纯静态的 HTMLJavaScript,可以完成对数据的写、改、删,查询功能没做。


因为数据量不大,不想用庞大的 mysql 之类的,最后决定用 re­dis 作为数据库。真实情况是除了 redis 之外其他数据库不会用


先来看后端的 re­dis 与 flask,这里主要使用了 flask_re­disflask_rest­ful 两个主要的库,有了这两个,后端就变得十分简单了。flask_re­dis 这个就不用多说了,就是用 python 操纵 re­dis 数据库,基本上与通过命令行操纵 re­dis 大同小异。flask_rest­ful 是这个 API 服务的核心,但用法不复杂,api 用到的对象都是从 Resource 里面继承来的,在新的对象里面重新定义 get、post 之类的方法就行了。最后在利用 add_resource 将 api 调用方法绑定到 url 就可以了。


#!python3
import os.path as opimport jsonfrom flask import Flask, abort, redirect, render_template, request, url_forfrom flask_redis import FlaskRedisfrom flask import jsonifyimport osfrom flask import send_from_directoryimport randomfrom flask_restful import reqparse, abort, Api, Resource
app = Flask(__name__)api = Api(app)app.config['REDIS_URL']="redis://:password@redisserver:[port]/1" #redis addressapp.config['JSON_AS_ASCII'] = False #讲人话rc=FlaskRedis(app,decode_responses=True) #讲UTF8Apdog="dogdogcat" #API key
def ver(key): if key==Apdog: return "OK" else: return "Bad"
class Dog(Resource): def get(self): cu=rc.llen('yl') bbn=random.randint(0,cu-1) ddd=rc.lindex('yl',bbn) rc.incr("dognum") # print(json.loads(ddd)) return jsonify({'id':bbn,'cnt':json.loads(ddd)})
def post(self): et=request.form['key'] # print(et) if ver(et)=="OK": ty=request.form['c'] ty2=request.form['f'] ty3=request.form['url'] ssui=json.dumps({'c':ty,'f':ty2,'url':ty3},ensure_ascii=False) sio=rc.rpush('yl',ssui) ddd=rc.lindex('yl',sio-1) # print(ddd) return jsonify({'id':sio-1,'cnt':json.loads(ddd)}) # pass else: return "APIkey error"
def put(self): et=request.form['key'] # print(et) if ver(et)=="OK": ty0=request.form['id'] ty=request.form['c'] ty2=request.form['f'] ty3=request.form['url'] ssui=json.dumps({'c':ty,'f':ty2,'url':ty3},ensure_ascii=False) ddd=rc.lset('yl',int(ty0),ssui) return jsonify(ddd) else:            return "APIkey error"
def delete(self): et=request.form['key'] if ver(et)=="OK": ty0=request.form['id'] print(ty0) ddd=rc.lindex('yl',int(ty0)) sti=rc.lrem('yl',0,ddd) return jsonify(sti) else: return "APIkey error"
class AllDog(Resource): def get(self): cu=rc.llen('yl') sh=rc.lrange('yl',0,cu-1) tu=list(map(json.loads,sh)) # print(tu[0]) return jsonify(tu) pass
class Dogkey(Resource): def post(self): ty=request.form['key'] print(ty) if ty==Apidog: return "OK" else: return "Bad" pass
class Dognum(Resource): def get(self): return rc.get("dognum")
api.add_resource(Dog, '/d')api.add_resource(AllDog, '/ad')api.add_resource(Dogkey, '/key')api.add_resource(Dognum, '/n')

后端代码并不复杂,相对而言前端就会更复杂一点。具体是什么样子的,到相关网页右键开发者工具就知道了,这里说几个重要的。后端主要用到的库有 jQueryboot­strapt4,在后台管理界面还会用到了 vue,都是通过 cdn 引入的,毕竟阿里云服务器限速 1M(128kb/s)。虽然除了我没几个人看,但还是能快一点算一点吧。


下面这个是每隔一段时间就调用一次 api 的 js 代码,用了 JavaScript,可以使 “死” 网页 “活” 起来。


由于用到了 JavaScript 加载异步资源,要特别注意跨域问题,在部署 API 服务的时候一定不要忘了。


var jv; var fm; $(document).ready(function(){ getjj(); cg(); setInterval(cg,7000);});
function getjj() { $.get("https://api.dogcraft.top/api/d",function (data,status) { fm=data.cnt.f; jv=data.cnt.c; $("#jj").text(jv); $("#cc").text(fm); })}
function getjj2(sdfu) { $.get("https://api.dogcraft.top/api/d",function (data,status) { fm=data.cnt.f; jv=data.cnt.c; sdfu(); })}
function cg() { getjj2(gtdog);}function gai() { //更换新的文字 $("#jj").text(jv); $("#cc").text(fm); // console.log("o")}function gtdog() { //渐变效果 $("#shu").fadeToggle(2000); setTimeout(gai,2000);//延时更换文字 $("#shu").fadeToggle(2000);}

上面这个的具体思路就是每隔一段时间就向 API 服务器发起一次请求,一旦 get 数据成功并存储到变量之中之后,就会让整个 div 渐变隐藏(设定渐变时间为 2s),然后设置定时任务 2s 之后更换文字,渐变隐藏与显示这个命令是异步的,开始动作之后会马上执行下一句,所以要设置这 2s 的延迟时间,在完全淡出隐藏之后再更新文字。


后台管理页面的 JavaScript 与这里的大同小异,就是多了 vue 的双向绑定与几个表单,可以自行去相关页面查看。

dogcraft 发起了一个读者讨论 有什么想说的? 精选讨论内容