本文讲解4.0版的jxTMS中python服务的web模块,整个系列的文章请查看:docker版jxTMS使用指南:4.0版升级内容
docker版本的使用,请参考:docker版jxTMS使用指南
web模块主要用来提供rest接口,只使用POST方法、参数以json格式放入body中。web模块采用jwt进行身份认证。
引用:
from jx.web import web
from jx.web import UserRouter
web模块提供了基础类:UserRouter。使用UserRouter可以很方便的处理一个uri:
1、创建一个继承UserRouter的类,然后重写onPost
class demoCls(UserRouter):
def onPost(self,u,data):
#u:登录用户
#data:post方法的json格式的body
...
return result,rc,msg
#result:结果数据,错误时为None
#rc:http的状态码,200为ok,其它有错误
#msg:错误时的提示信息,rc为200时为None
2、注册uri的处理类
web.register(uri_demo,demoCls)
注:web.register注册的新uri必须在web.start启动web服务前执行才会生效
web预置了登录uri:
/api/login
访问该uri需要两个参数:
username:用户名
password:密码
返回:
状态码:200
说明:认证成功
返回:
token:jwt生成的认证token
状态码:404
说明:认证失败
返回:
msg:失败原因
状态码:402
说明:认证失败
返回:
msg:错误的数据格式
登录成功后,后继访问都需要添加认证头:
X-Authorization:Bearer {token}
其中的token是认证成功后所获取的token值。
如果未提供X-Authorization或给出了错误的token,web返回:
状态码:401
说明:认证失败
返回:
msg:未正确设置X-Authorization头
状态码:404
说明:认证失败
返回:
msg:失败原因,包括:错误的token、用户不存在、已经超时,请重新登录、token失效,请重新登录
用户登录后token会保持15分钟的有效期,有效期内的每次访问都会自动展期,使用失效的token将会拒绝该次访问:token失效。
jxTMS的python服务的web模块不允许同一时刻的多重登录,在一个已登录用户的有效期内,如果有再次登录则:
默认拒绝有效期内的重复登录。即拒绝新登录,维持原有登录
如果用户配置为允许强制登录,则允许后者登录,但之前用户的token将会失效。即接受新登录,踢掉原有登录
web预置了登出uri:
/api/logout
访问该uri需持有有效token,不需要参数。
持有有效token的用户请求了该uri后,该token就会失效。
web预置了操作uri:
/api/access
访问该uri需持有有效token,并必须提供两个参数:
op:操作名
resID:希望访问的资源ID
jxTMS首先检查当前登录的用户是否对该资源ID的资源拥有执行op的权限。如果有权限则可以执行该操作,然后返回该操作的操作结果,并会对操作结果执行对应的数据处理策略。
返回:
状态码:200
说明:操作成功
返回:
op注册的操作函数的执行结果,并进行了相应的数据处理
状态码:402
说明:操作失败
返回:
msg:参数中未指定op或resID
状态码:404
说明:操作失败
返回:
msg:操作未注册
状态码:403
说明:操作失败
返回:
msg:没有操作权限
状态码:401
说明:认证失败
返回:
msg:未正确设置X-Authorization头
状态码:404
说明:认证失败
返回:
msg:失败原因,包括:错误的token、用户不存在、已经超时,请重新登录、token失效,请重新登录
状态码:402
说明:格式错误
返回:
msg:错误的数据格式
操作函数执行不成功,也应按相应格式返回错误码及其说明
注1:op需要注册
注2:resID要做授权,以允许该用户或其映射的角色可以操作【由参数op指定】该资源或该资源所属资源组
调用web.server即可启动web服务:
server(cls,port=10028)
#port:监听的端口号
用register添加的uri只能在web启动前添加。
jxTMS同时提供了一个webClient的python的web前端。具体使用参考testWeb.py。
参考资料:
jxTMS设计思想
jxTMS编程手册
下面的系列文章讲述了如何用jxTMS开发一个实用的业务功能:
如何用jxTMS开发一个功能
下面的系列文章讲述了jxTMS的一些基本开发能力:
jxTMS的HelloWorld