使用django创建简单的json api
django-simple-json-api的Python项目详细描述
django简单json api
安装
pip install django-simple-json-api
说明
将dsjapi.decorators.api
或dsjapi.decorators.api_rq
添加到视图函数中。
返回json可序列化对象或django.http.HttpResponse
对象。
引发dsjapi.exceptions.ServerException
异常将自动返回相应的json响应。
装饰器参数
field
dsjapi.fields.Field
请求正文中应有字段。默认值是None
。allowedMethods
list
的str
允许的http方法(大写)。默认值是["GET", "POST"]
。safeEncoding
bool
True
允许非dict
响应对象。默认值是False
。
@api
与@api_rq
@api
只提供已验证的请求数据。@api_rq
提供一个dsjapi.decorators.Request
对象,该对象同时包含request
(原始django.http.HttpRequest
对象)和data
(已验证的请求数据)属性。
示例
视图
fromdsjapi.decoratorsimportapifromdsjapi.fieldsimport*@api(DictField({"name":StringField(minLength=2,maxLength=32,regex=r'^[a-zA-Z ]+$'),"bio":StringField(maxLength=64,missing=Field.Do.DEFAULT,default=""),# Optional (default to "")"age":IntField(min=18,max=130)}))defindex(data):result=putUser(data["name"],data["bio"],data["age"])return{"result":result}
fromdsjapi.decoratorsimportapifromdsjapi.fieldsimport*@api(DictField({"start":ListField.byLength(2,FloatField()),"end":ListField.byLength(2,FloatField(),missing=Field.Do.SKIP),# Optional"time":FloatField(min=120,max=60*60)}))defindex(data):if"end"indata:route=getARoute(data["start"],data["time"])else:route=getABRoute(data["start"],data["end"],data["time"])return{"route":route}
fromdsjapi.decoratorsimportapifromdsjapi.fieldsimport*@api(DictField({"numbers":ListField.byLength(2,FloatField(min=0))}))defindex(data):sum=0fornumberindata["numbers"]:sum+=numberavg=sum/len(data["numbers"])return{"average":avg}
fromdsjapi.decoratorsimportapifromdsjapi.fieldsimport*fromdsjapi.exceptionsimport*@api(DictField({"id":IntField(min=0,max=4096),"password":StringField(min=8,max=32)}))defindex(data):user=getUserById(data["id"])ifuserisNone:raiseNotFoundException("User not found")ifuser.getPassword()!=data["password"]:raiseAuthenticationException("Wrong password")return{"id":user.getId(),"score":user.getScore()}
自定义字段
fromdsjapi.fieldsimportIntField,FieldExceptionclassEvenNumberField(IntField):def__init__(self,min=None,max=None,missing=Field.Do.RAISE,error=Field.Do.RAISE,default=None):super().__init__(int,min=min,max=max,missing=missing,error=error,default=default)defclean(self,value):value=super().clean(value)ifvalue%2!=0:raiseFieldException("Odd number")returnvalue