Package: glooweb
致力于restful风格api开发的轻量web框架glooweb一、开始安装pipinstallglooweb简单使用fromgloowebimportGloo，Response# 实例化一个app对象app=Gloo()# 创建一个路由对象,需要传入一个路由前缀参数api=Gloo.Router("/api")# 将路由注册进应用app.register(api)# 定义视图函数@api.get("/index")# 当路径为/api/index, 并且method为get时访问这个视图函数defindex(request):# 视图函数需要两个参数，上下文ctx, request请求对象returnResponse("<h1>index page</h1>")# 返回一个Response对象，也可直接返回一个字符串，当然这里不建议您这样做，因为当你使用响应拦截器时可能会出现异常情况。if__name__=='__main__':app.runserver()# 默认以127.0.0.1:9999运行浏览器中访问127.0.0.1:9999/api/index二、视图基本视图app=Gloo()api=app.Router("/api")app.register(api)@api.get("/index")defindex(request):# glooweb视图需要提供一个参数requestreturnResponse("<h1>index page</h1>")返回jsonfromgloowebimportGloo,jsonify,Responseapp=Gloo()api=app.Router("/api")app.register(api)@api.get("/index")defindex(request):returnjsonify(errno=0,errmsg="SUCCESSFUL")# 使用jsonify方法返回json格式的数据浏览器中访问127.0.0.1:9999/api/index返回其它状态码的视图fromgloowebimportGloo,jsonify,Responseapp=Gloo()api=app.Router("/api")app.register(api)@api.get("/index")defindex(request):content="<h1 style='color: red'>404 Not Fount</h1>"returnResponse(content,"404 NOT FOUND",content_type="text/html")# 参数status控制响应的状态码信息， content_type控制响应的mime类型浏览器中访问127.0.0.1:9999/api/index获取请求参数fromgloowebimportGloo,jsonify,Responseapp=Gloo()api=app.Router("/api")app.register(api)@api.get("/index")defindex(request):id_=request.GET.get("id",None)name=request.GET.get("name",None)email=request.GET.get("email",None)data=dict(id=id_,name=name,email=email)returnjsonify(errno=0,data=data)浏览器中访问127.0.0.1:9999/api/index?id=100&name=gloo&email=***为了更好支持restful风格的接口开发，您还可以使用post等其它method请求fromgloowebimportGloo,jsonify,Responseapp=Gloo()api=app.Router("/api")app.register(api)@api.post("/index")# post请求defindex(request):id_=request.POST.get("id",None)name=request.POST.get("name",None)email=request.POST.get("email",None)data=dict(id=id_,name=name,email=email)returnjsonify(errno=0,data=data)使用postman测试post请求glooweb还支持put, delete, head请求方法，使用方法类似类视图，glooweb 0.1.7版本新增类视图功能fromgloowebimportGloo,Response,jsonifyfromgloowebimportViewimportsimplejsonapp=Gloo()api=Gloo.Router('/api')app.register(api)classIndex(View):# 类视图需要继承自View类api=api# 需传入一个api参数，且api为Gloo.Router对象route_name=""# route_name路由地址, 当route_name未定义或为false时，路由地址为当前类名小写defget(self,request):# 当路由为route_name且method为GET时访问这个视图returnResponse("Index GET")defpost(self,request):# 当路由为route_name且method为POST时访问这个视图print(self.route_name)payload=simplejson.loads(request.body)returnjsonify(data=payload)defput(self,request):# 当路由为route_name且method为PUT时访问这个视图returnResponse("Index PUT")defdelete(self,request):# 当路由为route_name且method为DELETE时访问这个视图returnResponse("Index DELETE")if__name__=='__main__':app.runserver()浏览器中访问127.0.01/api/index使用postman测试post请求使用postman测试put请求使用postman测试delete请求三、路由提取URL参数需求url为/product9999需要将产品ID提取出来# 定义视图函数@api.get("/product{id:int}")# {id:int}匹配整形字符串defproduct(request):print(request.vars.id)# 访问url中的id的内容returnf"<h1>product{request.vars.id}</h1>"int匹配整形word匹配一个单词str匹配一个字符串float匹配浮点型any匹配任意字符浏览器中访问127.0.01/api/product9999四、拦截器路由拦截器# 定义视图函数@api.get("/product/{id:int}")# 当路径为/api/index, 并且method为get时访问这个视图函数defproduct(request):# 视图函数需要两个参数，上下文ctx, request请求对象print("视图函数")returnf"<h1>product{request.vars.id}</h1>"@api.reg_pre_interceptordefpre_product(request):print("视图函数响应之前")returnrequest@api.reg_post_interceptordefpost_product(ctx,request,response):print("视图函数响应之后")returnresponse运行结果视图函数响应之前
视图函数
视图函数响应之后127.0.0.1--[15/Oct/201918:04:15]"GET /api/product/123 HTTP/1.1"20020路由拦截器只对当前路由有效全局拦截器# 定义视图函数@api.get("/product/{id:int}")# 当路径为/api/index, 并且method为get时访问这个视图函数defproduct(request):# 视图函数需要两个参数，上下文ctx, request请求对象print("视图函数")returnf"<h1>product{request.vars.id}</h1>"@api.reg_pre_interceptordefpre_product(request):print("视图函数响应之前")returnrequest@api.reg_post_interceptordefpost_product(request,response):print("视图函数响应之后")returnresponse@Gloo.reg_pre_interceptordefpre(request):print("全局响应前视图")returnrequest@Gloo.reg_post_interceptordefpost(request,response):print("全局响应后视图")returnresponse运行结果拦截器及视图函数执行流程全局响应前视图
视图函数响应之前
视图函数
视图函数响应之后
全局响应后视图127.0.0.1--[15/Oct/201918:55:21]"GET /api/product/123 HTTP/1.1"20020五、上下文使用上下为程序扩展第三方功能fromgloowebimportGloo,jsonify,Responseimportsimplejsonapp=Gloo()@app.extend("load")# 使用app.extend装饰器扩展全局上下文，name参数不传入的话默认使用函数名defload(bytes_):# 使用simplejson加载bytes类型returnsimplejson.loads(bytes_)api=app.Router("/api")app.register(api)@api.post("/index")defindex(request):data=api.ctx.load(request.body)# api.ctx使用路由上下文，api.ctx找不到时会去全局上下文中找，路由上下文优先级大于全局returnjsonify(errno=0,data=data)if__name__=='__main__':app.runserver()使用postman测试六、模板glooweb是一个专注于api接口开发的轻量web框架，已不再提供过时的模板技术。如果您要使用的话可为您的应用扩展jijia2模块。七、模型模型建议使用ORM框架，SQLALCHEMY，glooweb对此没有做更多封装。最后Gloo在今后的很长一段时间里会使用和维护这个框架，如果您在使用glooweb框架时碰到了问题，或者您有一些好的建议。欢迎至件gloo88@yeah.net