Ai
2 Star 9 Fork 1

APIJSON/APIJSON-Python

加入 Gitee
与超过 1200万 开发者一起发现、参与优秀开源项目,私有仓库也完全免费 :)
免费加入
文件
克隆/下载
test.py 67.59 KB
一键复制 编辑 原始数据 按行查看 历史
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356135713581359136013611362136313641365136613671368136913701371137213731374137513761377137813791380138113821383138413851386138713881389139013911392139313941395139613971398139914001401140214031404140514061407140814091410141114121413141414151416141714181419142014211422142314241425142614271428142914301431143214331434143514361437143814391440144114421443144414451446144714481449145014511452145314541455145614571458145914601461146214631464146514661467146814691470147114721473147414751476147714781479148014811482148314841485148614871488148914901491149214931494149514961497149814991500150115021503150415051506150715081509151015111512151315141515151615171518151915201521152215231524152515261527152815291530153115321533153415351536153715381539154015411542154315441545154615471548154915501551155215531554155515561557155815591560156115621563156415651566156715681569157015711572157315741575157615771578157915801581158215831584158515861587158815891590159115921593159415951596159715981599160016011602160316041605160616071608160916101611161216131614161516161617161816191620162116221623162416251626162716281629163016311632163316341635163616371638163916401641164216431644164516461647164816491650165116521653165416551656165716581659166016611662166316641665166616671668166916701671167216731674167516761677167816791680168116821683168416851686168716881689169016911692169316941695169616971698169917001701170217031704170517061707170817091710171117121713171417151716171717181719172017211722172317241725172617271728172917301731173217331734173517361737173817391740174117421743174417451746174717481749175017511752175317541755175617571758175917601761176217631764176517661767176817691770177117721773177417751776177717781779178017811782178317841785178617871788178917901791179217931794179517961797179817991800180118021803180418051806180718081809181018111812
import os
from uliweb import manage
from uliweb.manage import make_simple_application
from json import loads as json_loads
from nose import with_setup
def setup():
os.chdir('demo')
manage.call('uliweb syncdb -v')
manage.call('uliweb reset -v -y')
manage.call('uliweb dbinit -v')
def pre_call_as(username):
from uliweb import models
User = models.user
user = User.get(User.c.username==username)
def pre_call(request):
request.user = user
return pre_call
def test_apijson_get():
"""
>>> application = make_simple_application(project_dir='.')
>>> handler = application.handler()
>>> #bad json
>>> data ='''{
... ,,,
... }'''
>>> r = handler.post('/apijson/get', data=data, pre_call=pre_call_as("admin"), middlewares=[])
>>> d = json_loads(r.data)
>>> print(d)
{'code': 400, 'msg': 'not json data in the request'}
>>> #query self user
>>> data ='''{
... "user":{
... "@role":"OWNER"
... }
... }'''
>>> r = handler.post('/apijson/get', data=data, pre_call=pre_call_as("admin"), middlewares=[])
>>> d = json_loads(r.data)
>>> print(d)
{'code': 200, 'msg': 'success', 'user': {'username': 'admin', 'nickname': 'Administrator', 'email': 'admin@localhost', 'is_superuser': True, 'last_login': None, 'date_join': '2018-01-01 00:00:00', 'image': '', 'active': False, 'locked': False, 'deleted': False, 'auth_type': 'default', 'timezone': '', 'id': 1}}
>>> #query with id
>>> data ='''{
... "user":{
... "@role":"ADMIN",
... "id": 2
... }
... }'''
>>> r = handler.post('/apijson/get', data=data, pre_call=pre_call_as("admin"), middlewares=[])
>>> d = json_loads(r.data)
>>> print(d)
{'code': 200, 'msg': 'success', 'user': {'username': 'usera', 'nickname': 'User A', 'email': 'usera@localhost', 'is_superuser': False, 'last_login': None, 'date_join': '2018-02-02 00:00:00', 'image': '', 'active': False, 'locked': False, 'deleted': False, 'auth_type': 'default', 'timezone': '', 'id': 2}}
>>> #query with @column
>>> data ='''{
... "user":{
... "@role":"OWNER",
... "@column": "id,username,email,nickname,is_superuser"
... }
... }'''
>>> r = handler.post('/apijson/get', data=data, pre_call=pre_call_as("admin"), middlewares=[])
>>> d = json_loads(r.data)
>>> print(d)
{'code': 200, 'msg': 'success', 'user': {'username': 'admin', 'nickname': 'Administrator', 'email': 'admin@localhost', 'is_superuser': True, 'id': 1}}
>>> #query with @column which have a non existing column name
>>> data ='''{
... "user":{
... "@role":"OWNER",
... "@column": "id,username,email,nickname,is_superuser,nonexisting"
... }
... }'''
>>> r = handler.post('/apijson/get', data=data, pre_call=pre_call_as("admin"), middlewares=[])
>>> d = json_loads(r.data)
>>> print(d)
{'code': 200, 'msg': 'success', 'user': {'username': 'admin', 'nickname': 'Administrator', 'email': 'admin@localhost', 'is_superuser': True, 'id': 1}}
>>> #query with a non existing column property
>>> data ='''{
... "user":{
... "nonexisting": 1
... }
... }'''
>>> r = handler.post('/apijson/get', data=data, pre_call=pre_call_as("admin"), middlewares=[])
>>> d = json_loads(r.data)
>>> print(d)
{'code': 400, 'msg': "'user' have no attribute 'nonexisting'"}
>>> #query one with a non existing model
>>> data ='''{
... "nonexist":{
... "id": 1
... }
... }'''
>>> r = handler.post('/apijson/get', data=data, pre_call=pre_call_as("admin"), middlewares=[])
>>> d = json_loads(r.data)
>>> print(d)
{'code': 400, 'msg': "model 'nonexist' not found"}
>>> #query one with a non expose model
>>> data ='''{
... "role":{
... "id": 1
... }
... }'''
>>> r = handler.post('/apijson/get', data=data, pre_call=pre_call_as("admin"), middlewares=[])
>>> d = json_loads(r.data)
>>> print(d)
{'code': 400, 'msg': "'role' not accessible"}
>>> #query one with UNKNOWN role (expected ok)
>>> data ='''{
... "moment":{
... "id": 1
... }
... }'''
>>> r = handler.post('/apijson/get', data=data, middlewares=[])
>>> d = json_loads(r.data)
>>> print(d)
{'code': 200, 'msg': 'success', 'moment': {'user_id': 2, 'date': '2018-11-01 00:00:00', 'content': 'test moment', 'picture_list': '[]', 'id': 1}}
>>> #query one with UNKNOWN role (expected fail)
>>> data ='''{
... "privacy":{
... "id": 1
... }
... }'''
>>> r = handler.post('/apijson/get', data=data, middlewares=[])
>>> d = json_loads(r.data)
>>> print(d)
{'code': 400, 'msg': "'privacy' not accessible by role 'UNKNOWN'"}
>>> #query one without user but use a non-UNKNOWN role
>>> data ='''{
... "publicnotice":{
... "@role":"OWNER",
... "id": 1
... }
... }'''
>>> r = handler.post('/apijson/get', data=data, middlewares=[])
>>> d = json_loads(r.data)
>>> print(d)
{'code': 400, 'msg': "no login user for role 'OWNER'"}
>>> #query one with OWNER but cannot filter with OWNER
>>> data ='''{
... "publicnotice":{
... "@role":"OWNER",
... "id": 1
... }
... }'''
>>> r = handler.post('/apijson/get', data=data, pre_call=pre_call_as("admin"), middlewares=[])
>>> d = json_loads(r.data)
>>> print(d)
{'code': 400, 'msg': "'publicnotice' cannot filter with owner"}
>>> #query one with OWNER which will use owner_condition() to filter
>>> data ='''{
... "moment":{
... "@role":"OWNER"
... }
... }'''
>>> r = handler.post('/apijson/get', data=data, pre_call=pre_call_as("usera"), middlewares=[])
Moment: owner_condition
>>> d = json_loads(r.data)
>>> print(d)
{'code': 200, 'msg': 'success', 'moment': {'user_id': 2, 'date': '2018-11-01 00:00:00', 'content': 'test moment', 'picture_list': '[]', 'id': 1}}
>>> #query one with UNKNOWN
>>> data ='''{
... "publicnotice":{
... "id": 1
... }
... }'''
>>> r = handler.post('/apijson/get', data=data, middlewares=[])
>>> d = json_loads(r.data)
>>> print(d)
{'code': 200, 'msg': 'success', 'publicnotice': {'date': '2018-12-09 00:00:00', 'content': 'notice: a', 'id': 1}}
>>> #query array with a non expose model
>>> data ='''{
... "[]":{
... "role": {"@role":"ADMIN"}
... }
... }'''
>>> r = handler.post('/apijson/get', data=data, pre_call=pre_call_as("admin"), middlewares=[])
>>> d = json_loads(r.data)
>>> print(d)
{'code': 400, 'msg': "'role' not accessible by apijson"}
>>> #query array with a non existing model
>>> data ='''{
... "[]":{
... "nonexisting": {"@role":"ADMIN"}
... }
... }'''
>>> r = handler.post('/apijson/get', data=data, pre_call=pre_call_as("admin"), middlewares=[])
>>> d = json_loads(r.data)
>>> print(d)
{'code': 400, 'msg': "model 'nonexisting' not found"}
>>> #query array with a non existing role
>>> data ='''{
... "[]":{
... "user": {"@role":"NONEXISTING"}
... }
... }'''
>>> r = handler.post('/apijson/get', data=data, pre_call=pre_call_as("admin"), middlewares=[])
>>> d = json_loads(r.data)
>>> print(d)
{'code': 400, 'msg': "'user' not accessible by role 'NONEXISTING'"}
>>> #query array with a role user don't have
>>> data ='''{
... "[]":{
... "user": {"@role":"ADMIN"}
... }
... }'''
>>> r = handler.post('/apijson/get', data=data, pre_call=pre_call_as("usera"), middlewares=[])
>>> d = json_loads(r.data)
>>> print(d)
{'code': 400, 'msg': "user doesn't have role 'ADMIN'"}
>>> #query array with no permission
>>> data ='''{
... "[]":{
... "user": {"@role":"superuser"}
... }
... }'''
>>> r = handler.post('/apijson/get', data=data, pre_call=pre_call_as("admin"), middlewares=[])
>>> d = json_loads(r.data)
>>> print(d)
{'code': 400, 'msg': "'user' not accessible by role 'superuser'"}
>>> #query array
>>> data ='''{
... "[]":{
... "user": {"@role":"ADMIN"}
... }
... }'''
>>> r = handler.post('/apijson/get', data=data, pre_call=pre_call_as("admin"), middlewares=[])
>>> d = json_loads(r.data)
>>> print(d)
{'code': 200, 'msg': 'success', '[]': [{'user': {'username': 'admin', 'nickname': 'Administrator', 'email': 'admin@localhost', 'is_superuser': True, 'last_login': None, 'date_join': '2018-01-01 00:00:00', 'image': '', 'active': False, 'locked': False, 'deleted': False, 'auth_type': 'default', 'timezone': '', 'id': 1}}, {'user': {'username': 'usera', 'nickname': 'User A', 'email': 'usera@localhost', 'is_superuser': False, 'last_login': None, 'date_join': '2018-02-02 00:00:00', 'image': '', 'active': False, 'locked': False, 'deleted': False, 'auth_type': 'default', 'timezone': '', 'id': 2}}, {'user': {'username': 'userb', 'nickname': 'User B', 'email': 'userb@localhost', 'is_superuser': False, 'last_login': None, 'date_join': '2018-03-03 00:00:00', 'image': '', 'active': False, 'locked': False, 'deleted': False, 'auth_type': 'default', 'timezone': '', 'id': 3}}, {'user': {'username': 'userc', 'nickname': 'User C', 'email': 'userc@localhost', 'is_superuser': False, 'last_login': None, 'date_join': '2018-04-04 00:00:00', 'image': '', 'active': False, 'locked': False, 'deleted': False, 'auth_type': 'default', 'timezone': '', 'id': 4}}]}
>>> #query array
>>> data ='''{
... "[]":{
... "user": {
... "@role":"ADMIN",
... "@column":"id,username,nickname,email"
... }
... }
... }'''
>>> r = handler.post('/apijson/get', data=data, pre_call=pre_call_as("admin"), middlewares=[])
>>> d = json_loads(r.data)
>>> print(d)
{'code': 200, 'msg': 'success', '[]': [{'user': {'username': 'admin', 'nickname': 'Administrator', 'email': 'admin@localhost', 'id': 1}}, {'user': {'username': 'usera', 'nickname': 'User A', 'email': 'usera@localhost', 'id': 2}}, {'user': {'username': 'userb', 'nickname': 'User B', 'email': 'userb@localhost', 'id': 3}}, {'user': {'username': 'userc', 'nickname': 'User C', 'email': 'userc@localhost', 'id': 4}}]}
>>> #query array with non existing role
>>> data ='''{
... "[]":{
... "user": {
... "@role":"NONEXISTING",
... "@column":"id,username,nickname,email"
... }
... }
... }'''
>>> r = handler.post('/apijson/get', data=data, pre_call=pre_call_as("admin"), middlewares=[])
>>> d = json_loads(r.data)
>>> print(d)
{'code': 400, 'msg': "'user' not accessible by role 'NONEXISTING'"}
>>> #query array with UNKNOWN
>>> data ='''{
... "[]":{
... "user": {
... "@column":"id,username,nickname,email"
... }
... }
... }'''
>>> r = handler.post('/apijson/get', data=data, middlewares=[])
>>> d = json_loads(r.data)
>>> print(d)
{'code': 400, 'msg': "'user' not accessible by role 'UNKNOWN'"}
>>> #query array without login user
>>> data ='''{
... "[]":{
... "user": {
... "@role":"ADMIN",
... "@column":"id,username,nickname,email"
... }
... }
... }'''
>>> r = handler.post('/apijson/get', data=data, middlewares=[])
>>> d = json_loads(r.data)
>>> print(d)
{'code': 400, 'msg': "no login user for role 'ADMIN'"}
>>> #query array with a role which the user doesn't really have
>>> data ='''{
... "[]":{
... "user": {
... "@role":"ADMIN",
... "@column":"id,username,nickname,email"
... }
... }
... }'''
>>> r = handler.post('/apijson/get', data=data, pre_call=pre_call_as("usera"), middlewares=[])
>>> d = json_loads(r.data)
>>> print(d)
{'code': 400, 'msg': "user doesn't have role 'ADMIN'"}
>>> #query array with @count
>>> data ='''{
... "[]":{
... "@count":3,
... "user": {
... }
... }
... }'''
>>> r = handler.post('/apijson/get', data=data, pre_call=pre_call_as("usera"), middlewares=[])
>>> d = json_loads(r.data)
>>> print(d)
{'code': 200, 'msg': 'success', '[]': [{'user': {'username': 'admin', 'nickname': 'Administrator', 'email': 'admin@localhost', 'is_superuser': True, 'last_login': None, 'date_join': '2018-01-01 00:00:00', 'image': '', 'active': False, 'locked': False, 'deleted': False, 'auth_type': 'default', 'timezone': '', 'id': 1}}, {'user': {'username': 'usera', 'nickname': 'User A', 'email': 'usera@localhost', 'is_superuser': False, 'last_login': None, 'date_join': '2018-02-02 00:00:00', 'image': '', 'active': False, 'locked': False, 'deleted': False, 'auth_type': 'default', 'timezone': '', 'id': 2}}, {'user': {'username': 'userb', 'nickname': 'User B', 'email': 'userb@localhost', 'is_superuser': False, 'last_login': None, 'date_join': '2018-03-03 00:00:00', 'image': '', 'active': False, 'locked': False, 'deleted': False, 'auth_type': 'default', 'timezone': '', 'id': 3}}]}
>>> #query array ,@count is bad param
>>> data ='''{
... "[]":{
... "@count":"bad",
... "user": {
... }
... }
... }'''
>>> r = handler.post('/apijson/get', data=data, pre_call=pre_call_as("usera"), middlewares=[])
>>> d = json_loads(r.data)
>>> print(d)
{'code': 400, 'msg': "@count should be an int, but get 'bad'"}
>>> #query array with @count and @page
>>> data ='''{
... "[]":{
... "@count":2,
... "@page":1,
... "user": {
... }
... }
... }'''
>>> r = handler.post('/apijson/get', data=data, pre_call=pre_call_as("usera"), middlewares=[])
>>> d = json_loads(r.data)
>>> print(d)
{'code': 200, 'msg': 'success', '[]': [{'user': {'username': 'userb', 'nickname': 'User B', 'email': 'userb@localhost', 'is_superuser': False, 'last_login': None, 'date_join': '2018-03-03 00:00:00', 'image': '', 'active': False, 'locked': False, 'deleted': False, 'auth_type': 'default', 'timezone': '', 'id': 3}}, {'user': {'username': 'userc', 'nickname': 'User C', 'email': 'userc@localhost', 'is_superuser': False, 'last_login': None, 'date_join': '2018-04-04 00:00:00', 'image': '', 'active': False, 'locked': False, 'deleted': False, 'auth_type': 'default', 'timezone': '', 'id': 4}}]}
>>> #query array with @count and @page, @page bad param
>>> data ='''{
... "[]":{
... "@count":2,
... "@page":"bad",
... "user": {
... }
... }
... }'''
>>> r = handler.post('/apijson/get', data=data, pre_call=pre_call_as("usera"), middlewares=[])
>>> d = json_loads(r.data)
>>> print(d)
{'code': 400, 'msg': "@page should be an int, but get 'bad'"}
>>> #query array with @count and @page, @page <0
>>> data ='''{
... "[]":{
... "@count":2,
... "@page":-2,
... "user": {
... }
... }
... }'''
>>> r = handler.post('/apijson/get', data=data, pre_call=pre_call_as("usera"), middlewares=[])
>>> d = json_loads(r.data)
>>> print(d)
{'code': 400, 'msg': "page should >0, but get '-2'"}
>>> #query array with @count/@page/@query, @query bad param
>>> data ='''{
... "[]":{
... "@count":2,
... "@page":1,
... "@query":3,
... "user": {
... }
... }
... }'''
>>> r = handler.post('/apijson/get', data=data, pre_call=pre_call_as("usera"), middlewares=[])
>>> d = json_loads(r.data)
>>> print(d)
{'code': 400, 'msg': "bad param 'query': 3"}
>>> #query array with @count/@page/@query, @query = 0
>>> data ='''{
... "[]":{
... "@count":2,
... "@page":1,
... "@query":0,
... "user": {
... }
... }
... }'''
>>> r = handler.post('/apijson/get', data=data, pre_call=pre_call_as("usera"), middlewares=[])
>>> d = json_loads(r.data)
>>> print(d)
{'code': 200, 'msg': 'success', '[]': [{'user': {'username': 'userb', 'nickname': 'User B', 'email': 'userb@localhost', 'is_superuser': False, 'last_login': None, 'date_join': '2018-03-03 00:00:00', 'image': '', 'active': False, 'locked': False, 'deleted': False, 'auth_type': 'default', 'timezone': '', 'id': 3}}, {'user': {'username': 'userc', 'nickname': 'User C', 'email': 'userc@localhost', 'is_superuser': False, 'last_login': None, 'date_join': '2018-04-04 00:00:00', 'image': '', 'active': False, 'locked': False, 'deleted': False, 'auth_type': 'default', 'timezone': '', 'id': 4}}]}
>>> #query array with OWNER but cannot filter with OWNER
>>> data ='''{
... "[]":{
... "publicnotice": {
... "@role":"OWNER"
... }
... }
... }'''
>>> r = handler.post('/apijson/get', data=data, pre_call=pre_call_as("admin"), middlewares=[])
>>> d = json_loads(r.data)
>>> print(d)
{'code': 400, 'msg': "'publicnotice' cannot filter with owner"}
>>> #query array with OWNER
>>> data ='''{
... "[]":{
... "comment": {
... "@role":"OWNER"
... }
... }
... }'''
>>> r = handler.post('/apijson/get', data=data, pre_call=pre_call_as("admin"), middlewares=[])
>>> d = json_loads(r.data)
>>> print(d)
{'code': 200, 'msg': 'success', '[]': [{'comment': {'user_id': 1, 'to_id': 3, 'moment_id': 1, 'date': '2018-11-01 00:00:00', 'content': 'comment from admin', 'id': 1}}]}
>>> #query array with OWNER, the model using owner_condition
>>> data ='''{
... "[]":{
... "moment": {
... "@role":"OWNER"
... }
... }
... }'''
>>> r = handler.post('/apijson/get', data=data, pre_call=pre_call_as("usera"), middlewares=[])
Moment: owner_condition
>>> d = json_loads(r.data)
>>> print(d)
{'code': 200, 'msg': 'success', '[]': [{'moment': {'user_id': 2, 'date': '2018-11-01 00:00:00', 'content': 'test moment', 'picture_list': '[]', 'id': 1}}]}
>>> #query array with some filter column
>>> data ='''{
... "[]":{
... "@count":4,
... "@page":0,
... "user":{
... "@column":"id,username,nickname,email",
... "@order":"id-",
... "@role":"ADMIN",
... "username":"admin"
... }
... }
... }'''
>>> r = handler.post('/apijson/get', data=data, pre_call=pre_call_as("admin"), middlewares=[])
>>> d = json_loads(r.data)
>>> print(d)
{'code': 200, 'msg': 'success', '[]': [{'user': {'username': 'admin', 'nickname': 'Administrator', 'email': 'admin@localhost', 'id': 1}}]}
>>> #query array with reference, @query = 1
>>> data ='''{
... "[]":{
... "@count":2,
... "@page":0,
... "@query":1,
... "user":{
... "@column":"id,username,nickname,email",
... "@order":"id-",
... "@role":"ADMIN"
... }
... },
... "total@":"/[]/total"
... }'''
>>> r = handler.post('/apijson/get', data=data, pre_call=pre_call_as("admin"), middlewares=[])
>>> d = json_loads(r.data)
>>> print(d)
{'code': 200, 'msg': 'success', 'total': 4}
>>> #query array with reference, @query = 2
>>> data ='''{
... "[]":{
... "@count":2,
... "@page":0,
... "@query":2,
... "user":{
... "@column":"id,username,nickname,email",
... "@order":"id-",
... "@role":"ADMIN"
... }
... },
... "total@":"/[]/total"
... }'''
>>> r = handler.post('/apijson/get', data=data, pre_call=pre_call_as("admin"), middlewares=[])
>>> d = json_loads(r.data)
>>> print(d)
{'code': 200, 'msg': 'success', '[]': [{'user': {'username': 'userc', 'nickname': 'User C', 'email': 'userc@localhost', 'id': 4}}, {'user': {'username': 'userb', 'nickname': 'User B', 'email': 'userb@localhost', 'id': 3}}], 'total': 4}
>>> #query array with @order +
>>> data ='''{
... "[]":{
... "@count":2,
... "@page":0,
... "@query":2,
... "user":{
... "@column":"id,username,nickname,email",
... "@order":"id+",
... "@role":"ADMIN"
... }
... },
... "total@":"/[]/total"
... }'''
>>> r = handler.post('/apijson/get', data=data, pre_call=pre_call_as("admin"), middlewares=[])
>>> d = json_loads(r.data)
>>> print(d)
{'code': 200, 'msg': 'success', '[]': [{'user': {'username': 'admin', 'nickname': 'Administrator', 'email': 'admin@localhost', 'id': 1}}, {'user': {'username': 'usera', 'nickname': 'User A', 'email': 'usera@localhost', 'id': 2}}], 'total': 4}
>>> #query array with @order having a non existing column
>>> data ='''{
... "[]":{
... "@count":2,
... "@page":0,
... "@query":2,
... "user":{
... "@column":"id,username,nickname,email",
... "@order":"nonexist+",
... "@role":"ADMIN"
... }
... },
... "total@":"/[]/total"
... }'''
>>> r = handler.post('/apijson/get', data=data, pre_call=pre_call_as("admin"), middlewares=[])
>>> d = json_loads(r.data)
>>> print(d)
{'code': 400, 'msg': "'user' doesn't have column 'nonexist'"}
>>> #query array with @expr
>>> data ='''{
... "[]":{
... "@count":4,
... "@page":0,
... "user":{
... "@column":"id,username,nickname,email",
... "@order":"id-",
... "@role":"ADMIN",
... "@expr":["username$","|","nickname$"],
... "username$":"%b%",
... "nickname$":"%c%"
... }
... }
... }'''
>>> r = handler.post('/apijson/get', data=data, pre_call=pre_call_as("admin"), middlewares=[])
>>> d = json_loads(r.data)
>>> print(d)
{'code': 200, 'msg': 'success', '[]': [{'user': {'username': 'userc', 'nickname': 'User C', 'email': 'userc@localhost', 'id': 4}}, {'user': {'username': 'userb', 'nickname': 'User B', 'email': 'userb@localhost', 'id': 3}}]}
>>> #query array with @expr, bad param which is not list
>>> data ='''{
... "[]":{
... "@count":4,
... "@page":0,
... "user":{
... "@column":"id,username,nickname,email",
... "@order":"id-",
... "@role":"ADMIN",
... "@expr":{},
... "username$":"%b%",
... "nickname$":"%c%"
... }
... }
... }'''
>>> r = handler.post('/apijson/get', data=data, pre_call=pre_call_as("admin"), middlewares=[])
>>> d = json_loads(r.data)
>>> print(d)
{'code': 400, 'msg': "only accept array in @expr, but get 'OrderedDict()'"}
>>> #query array with @expr, bad param which is an empty list
>>> data ='''{
... "[]":{
... "@count":4,
... "@page":0,
... "user":{
... "@column":"id,username,nickname,email",
... "@order":"id-",
... "@role":"ADMIN",
... "@expr":[],
... "username$":"%b%",
... "nickname$":"%c%"
... }
... }
... }'''
>>> r = handler.post('/apijson/get', data=data, pre_call=pre_call_as("admin"), middlewares=[])
>>> d = json_loads(r.data)
>>> print(d)
{'code': 400, 'msg': "only accept 2 or 3 items in @expr, but get '[]'"}
>>> #query array with @expr, bad param which is >3 items list
>>> data ='''{
... "[]":{
... "@count":4,
... "@page":0,
... "user":{
... "@column":"id,username,nickname,email",
... "@order":"id-",
... "@role":"ADMIN",
... "@expr":["username$","|","username$","|","nickname$"],
... "username$":"%b%",
... "nickname$":"%c%"
... }
... }
... }'''
>>> r = handler.post('/apijson/get', data=data, pre_call=pre_call_as("admin"), middlewares=[])
>>> d = json_loads(r.data)
>>> print(d)
{'code': 400, 'msg': "only accept 2 or 3 items in @expr, but get '['username$', '|', 'username$', '|', 'nickname$']'"}
>>> #query array with @expr, bad param which have bad operator
>>> data ='''{
... "[]":{
... "@count":4,
... "@page":0,
... "user":{
... "@column":"id,username,nickname,email",
... "@order":"id-",
... "@role":"ADMIN",
... "@expr":["username$","*","nickname$"],
... "username$":"%b%",
... "nickname$":"%c%"
... }
... }
... }'''
>>> r = handler.post('/apijson/get', data=data, pre_call=pre_call_as("admin"), middlewares=[])
>>> d = json_loads(r.data)
>>> print(d)
{'code': 400, 'msg': "unknown operator: '*'"}
>>> #query array with @expr, bad expr: & only 1 parameter
>>> data ='''{
... "[]":{
... "@count":4,
... "@page":0,
... "user":{
... "@column":"id,username,nickname,email",
... "@order":"id-",
... "@role":"ADMIN",
... "@expr":["&","nickname$"],
... "username$":"%b%",
... "nickname$":"%c%"
... }
... }
... }'''
>>> r = handler.post('/apijson/get', data=data, pre_call=pre_call_as("admin"), middlewares=[])
>>> d = json_loads(r.data)
>>> print(d)
{'code': 400, 'msg': "'&'(and) expression need 3 items, but get '['&', 'nickname$']'"}
>>> #query array with @expr, bad expr: | only 1 parameter
>>> data ='''{
... "[]":{
... "@count":4,
... "@page":0,
... "user":{
... "@column":"id,username,nickname,email",
... "@order":"id-",
... "@role":"ADMIN",
... "@expr":["|","nickname$"],
... "username$":"%b%",
... "nickname$":"%c%"
... }
... }
... }'''
>>> r = handler.post('/apijson/get', data=data, pre_call=pre_call_as("admin"), middlewares=[])
>>> d = json_loads(r.data)
>>> print(d)
{'code': 400, 'msg': "'|'(or) expression need 3 items, but get '['|', 'nickname$']'"}
>>> #query array with @expr, bad expr: | only 1 parameter
>>> data ='''{
... "[]":{
... "@count":4,
... "@page":0,
... "user":{
... "@column":"id,username,nickname,email",
... "@order":"id-",
... "@role":"ADMIN",
... "@expr":["username$","!","nickname$"],
... "username$":"%b%",
... "nickname$":"%c%"
... }
... }
... }'''
>>> r = handler.post('/apijson/get', data=data, pre_call=pre_call_as("admin"), middlewares=[])
>>> d = json_loads(r.data)
>>> print(d)
{'code': 400, 'msg': "'!'(not) expression need 2 items, but get '['username$', '!', 'nickname$']'"}
>>> #query array with like
>>> data ='''{
... "[]":{
... "@count":4,
... "@page":0,
... "user":{
... "@column":"id,username,nickname,email",
... "@order":"id-",
... "@role":"ADMIN",
... "username$":"%b%"
... }
... }
... }'''
>>> r = handler.post('/apijson/get', data=data, pre_call=pre_call_as("admin"), middlewares=[])
>>> d = json_loads(r.data)
>>> print(d)
{'code': 200, 'msg': 'success', '[]': [{'user': {'username': 'userb', 'nickname': 'User B', 'email': 'userb@localhost', 'id': 3}}]}
>>> #query array with like, but gave a nonexist column
>>> data ='''{
... "[]":{
... "@count":4,
... "@page":0,
... "user":{
... "@column":"id,username,nickname,email",
... "@order":"id-",
... "@role":"ADMIN",
... "nonexist$":"%b%"
... }
... }
... }'''
>>> r = handler.post('/apijson/get', data=data, pre_call=pre_call_as("admin"), middlewares=[])
>>> d = json_loads(r.data)
>>> print(d)
{'code': 400, 'msg': "model does not have column: 'nonexist'"}
>>> #query array with a nonexist column
>>> data ='''{
... "[]":{
... "@count":4,
... "@page":0,
... "user":{
... "@column":"id,username,nickname,email",
... "@order":"id-",
... "@role":"ADMIN",
... "nonexist":1
... }
... }
... }'''
>>> r = handler.post('/apijson/get', data=data, pre_call=pre_call_as("admin"), middlewares=[])
>>> d = json_loads(r.data)
>>> print(d)
{'code': 400, 'msg': "non-existent column or not support item: 'nonexist'"}
>>> #query array, {} with list
>>> data ='''{
... "[]":{
... "moment": {
... "id{}": [1, 2]
... }
... }
... }'''
>>> r = handler.post('/apijson/get', data=data, pre_call=pre_call_as("admin"), middlewares=[])
>>> d = json_loads(r.data)
>>> print(d)
{'code': 200, 'msg': 'success', '[]': [{'moment': {'user_id': 2, 'date': '2018-11-01 00:00:00', 'content': 'test moment', 'picture_list': '[]', 'id': 1}}, {'moment': {'user_id': 3, 'date': '2018-11-02 00:00:00', 'content': 'test moment from b', 'picture_list': '[]', 'id': 2}}]}
>>> #query array, !{} with list
>>> data ='''{
... "[]":{
... "moment": {
... "id!{}": [1, 2]
... }
... }
... }'''
>>> r = handler.post('/apijson/get', data=data, pre_call=pre_call_as("admin"), middlewares=[])
>>> d = json_loads(r.data)
>>> print(d)
{'code': 200, 'msg': 'success', '[]': [{'moment': {'user_id': 4, 'date': '2018-11-06 00:00:00', 'content': 'test moment from c', 'picture_list': '[]', 'id': 3}}]}
>>> #query array, {} with a non-exist column name
>>> data ='''{
... "[]":{
... "moment": {
... "nonexist{}": [1, 2]
... }
... }
... }'''
>>> r = handler.post('/apijson/get', data=data, pre_call=pre_call_as("admin"), middlewares=[])
>>> d = json_loads(r.data)
>>> print(d)
{'code': 400, 'msg': "model does not have column: 'nonexist'"}
>>> #query array, {} >=
>>> data ='''{
... "[]":{
... "moment": {
... "id{}": ">=2"
... }
... }
... }'''
>>> r = handler.post('/apijson/get', data=data, pre_call=pre_call_as("admin"), middlewares=[])
>>> d = json_loads(r.data)
>>> print(d)
{'code': 200, 'msg': 'success', '[]': [{'moment': {'user_id': 3, 'date': '2018-11-02 00:00:00', 'content': 'test moment from b', 'picture_list': '[]', 'id': 2}}, {'moment': {'user_id': 4, 'date': '2018-11-06 00:00:00', 'content': 'test moment from c', 'picture_list': '[]', 'id': 3}}]}
>>> #query array, {} =
>>> data ='''{
... "[]":{
... "moment": {
... "id{}": "=2"
... }
... }
... }'''
>>> r = handler.post('/apijson/get', data=data, pre_call=pre_call_as("admin"), middlewares=[])
>>> d = json_loads(r.data)
>>> print(d)
{'code': 200, 'msg': 'success', '[]': [{'moment': {'user_id': 3, 'date': '2018-11-02 00:00:00', 'content': 'test moment from b', 'picture_list': '[]', 'id': 2}}]}
>>> #query array, {} >
>>> data ='''{
... "[]":{
... "moment": {
... "id{}": ">2"
... }
... }
... }'''
>>> r = handler.post('/apijson/get', data=data, pre_call=pre_call_as("admin"), middlewares=[])
>>> d = json_loads(r.data)
>>> print(d)
{'code': 200, 'msg': 'success', '[]': [{'moment': {'user_id': 4, 'date': '2018-11-06 00:00:00', 'content': 'test moment from c', 'picture_list': '[]', 'id': 3}}]}
>>> #query array, {} <=
>>> data ='''{
... "[]":{
... "moment": {
... "id{}": "<=2"
... }
... }
... }'''
>>> r = handler.post('/apijson/get', data=data, pre_call=pre_call_as("admin"), middlewares=[])
>>> d = json_loads(r.data)
>>> print(d)
{'code': 200, 'msg': 'success', '[]': [{'moment': {'user_id': 2, 'date': '2018-11-01 00:00:00', 'content': 'test moment', 'picture_list': '[]', 'id': 1}}, {'moment': {'user_id': 3, 'date': '2018-11-02 00:00:00', 'content': 'test moment from b', 'picture_list': '[]', 'id': 2}}]}
>>> #query array, {} <
>>> data ='''{
... "[]":{
... "moment": {
... "id{}": "<2"
... }
... }
... }'''
>>> r = handler.post('/apijson/get', data=data, pre_call=pre_call_as("admin"), middlewares=[])
>>> d = json_loads(r.data)
>>> print(d)
{'code': 200, 'msg': 'success', '[]': [{'moment': {'user_id': 2, 'date': '2018-11-01 00:00:00', 'content': 'test moment', 'picture_list': '[]', 'id': 1}}]}
>>> #query array, {} <= with datetime
>>> data ='''{
... "[]":{
... "moment": {
... "date{}": "<='2018-11-02 00:00'"
... }
... }
... }'''
>>> r = handler.post('/apijson/get', data=data, pre_call=pre_call_as("admin"), middlewares=[])
>>> d = json_loads(r.data)
>>> print(d)
{'code': 200, 'msg': 'success', '[]': [{'moment': {'user_id': 2, 'date': '2018-11-01 00:00:00', 'content': 'test moment', 'picture_list': '[]', 'id': 1}}, {'moment': {'user_id': 3, 'date': '2018-11-02 00:00:00', 'content': 'test moment from b', 'picture_list': '[]', 'id': 2}}]}
>>> #query array, {} >= with datetime
>>> data ='''{
... "[]":{
... "moment": {
... "date{}": ">='2018-11-02 00:00'"
... }
... }
... }'''
>>> r = handler.post('/apijson/get', data=data, pre_call=pre_call_as("admin"), middlewares=[])
>>> d = json_loads(r.data)
>>> print(d)
{'code': 200, 'msg': 'success', '[]': [{'moment': {'user_id': 3, 'date': '2018-11-02 00:00:00', 'content': 'test moment from b', 'picture_list': '[]', 'id': 2}}, {'moment': {'user_id': 4, 'date': '2018-11-06 00:00:00', 'content': 'test moment from c', 'picture_list': '[]', 'id': 3}}]}
>>> #query array, {} >= with a invalid datetime
>>> data ='''{
... "[]":{
... "moment": {
... "date{}": ">='2018-11-42 00:00'"
... }
... }
... }'''
>>> r = handler.post('/apijson/get', data=data, pre_call=pre_call_as("admin"), middlewares=[])
>>> d = json_loads(r.data)
>>> print(d)
{'code': 400, 'msg': "''2018-11-42 00:00'' cannot convert to datetime"}
>>> #query array, !{} <
>>> data ='''{
... "[]":{
... "moment": {
... "id!{}": "<2"
... }
... }
... }'''
>>> r = handler.post('/apijson/get', data=data, pre_call=pre_call_as("admin"), middlewares=[])
>>> d = json_loads(r.data)
>>> print(d)
{'code': 200, 'msg': 'success', '[]': [{'moment': {'user_id': 3, 'date': '2018-11-02 00:00:00', 'content': 'test moment from b', 'picture_list': '[]', 'id': 2}}, {'moment': {'user_id': 4, 'date': '2018-11-06 00:00:00', 'content': 'test moment from c', 'picture_list': '[]', 'id': 3}}]}
>>> #query array, {} !=
>>> data ='''{
... "[]":{
... "moment": {
... "id{}": "!=2"
... }
... }
... }'''
>>> r = handler.post('/apijson/get', data=data, pre_call=pre_call_as("admin"), middlewares=[])
>>> d = json_loads(r.data)
>>> print(d)
{'code': 200, 'msg': 'success', '[]': [{'moment': {'user_id': 2, 'date': '2018-11-01 00:00:00', 'content': 'test moment', 'picture_list': '[]', 'id': 1}}, {'moment': {'user_id': 4, 'date': '2018-11-06 00:00:00', 'content': 'test moment from c', 'picture_list': '[]', 'id': 3}}]}
>>> #query array, {} with wrong operator
>>> data ='''{
... "[]":{
... "moment": {
... "id{}": "%=2"
... }
... }
... }'''
>>> r = handler.post('/apijson/get', data=data, pre_call=pre_call_as("admin"), middlewares=[])
>>> d = json_loads(r.data)
>>> print(d)
{'code': 400, 'msg': "not support '%=2'"}
>>> #query array, {} condition list
>>> data ='''{
... "[]":{
... "user": {
... "@role": "ADMIN",
... "id{}": "<=2,>3",
... "@column": "username,nickname,id"
... }
... }
... }'''
>>> r = handler.post('/apijson/get', data=data, pre_call=pre_call_as("admin"), middlewares=[])
>>> d = json_loads(r.data)
>>> print(d)
{'code': 200, 'msg': 'success', '[]': [{'user': {'username': 'admin', 'nickname': 'Administrator', 'id': 1}}, {'user': {'username': 'usera', 'nickname': 'User A', 'id': 2}}, {'user': {'username': 'userc', 'nickname': 'User C', 'id': 4}}]}
>>> #query array, |{} condition list
>>> data ='''{
... "[]":{
... "user": {
... "@role": "ADMIN",
... "id|{}": "<=2,>3",
... "@column": "username,nickname,id"
... }
... }
... }'''
>>> r = handler.post('/apijson/get', data=data, pre_call=pre_call_as("admin"), middlewares=[])
>>> d = json_loads(r.data)
>>> print(d)
{'code': 200, 'msg': 'success', '[]': [{'user': {'username': 'admin', 'nickname': 'Administrator', 'id': 1}}, {'user': {'username': 'usera', 'nickname': 'User A', 'id': 2}}, {'user': {'username': 'userc', 'nickname': 'User C', 'id': 4}}]}
>>> #query array, &{} condition list
>>> data ='''{
... "[]":{
... "user": {
... "@role": "ADMIN",
... "id&{}": ">2,<=4",
... "@column": "username,nickname,id"
... }
... }
... }'''
>>> r = handler.post('/apijson/get', data=data, pre_call=pre_call_as("admin"), middlewares=[])
>>> d = json_loads(r.data)
>>> print(d)
{'code': 200, 'msg': 'success', '[]': [{'user': {'username': 'userb', 'nickname': 'User B', 'id': 3}}, {'user': {'username': 'userc', 'nickname': 'User C', 'id': 4}}]}
>>> #query array, &{} condition list
>>> data ='''{
... "[]":{
... "user": {
... "@role": "ADMIN",
... "date_join&{}": ">='2018-1-1 00:00',<='2018-2-2 00:00'",
... "@column": "username,nickname,id,date_join"
... }
... }
... }'''
>>> r = handler.post('/apijson/get', data=data, pre_call=pre_call_as("admin"), middlewares=[])
>>> d = json_loads(r.data)
>>> print(d)
{'code': 200, 'msg': 'success', '[]': [{'user': {'username': 'admin', 'nickname': 'Administrator', 'date_join': '2018-01-01 00:00:00', 'id': 1}}, {'user': {'username': 'usera', 'nickname': 'User A', 'date_join': '2018-02-02 00:00:00', 'id': 2}}]}
>>> #query array, {} multiple condition to a same field
>>> data ='''{
... "[]":{
... "user": {
... "@role": "ADMIN",
... "id&{}": ">2,<=4",
... "id{}": "!=3",
... "@column": "username,nickname,id"
... }
... }
... }'''
>>> r = handler.post('/apijson/get', data=data, pre_call=pre_call_as("admin"), middlewares=[])
>>> d = json_loads(r.data)
>>> print(d)
{'code': 200, 'msg': 'success', '[]': [{'user': {'username': 'userc', 'nickname': 'User C', 'id': 4}}]}
>>> #query array, !{} condition list
>>> data ='''{
... "[]":{
... "user": {
... "@role": "ADMIN",
... "id!{}": ">2,<=4",
... "@column": "username,nickname,id"
... }
... }
... }'''
>>> r = handler.post('/apijson/get', data=data, pre_call=pre_call_as("admin"), middlewares=[])
>>> d = json_loads(r.data)
>>> print(d)
{'code': 400, 'msg': "'!' not supported in condition list"}
>>> #query array, |{} condition list, item more than 2
>>> data ='''{
... "[]":{
... "user": {
... "@role": "ADMIN",
... "id|{}": "=1,=2,>=4",
... "@column": "username,id"
... }
... }
... }'''
>>> r = handler.post('/apijson/get', data=data, pre_call=pre_call_as("admin"), middlewares=[])
>>> d = json_loads(r.data)
>>> print(d)
{'code': 200, 'msg': 'success', '[]': [{'user': {'username': 'admin', 'id': 1}}, {'user': {'username': 'usera', 'id': 2}}, {'user': {'username': 'userc', 'id': 4}}]}
>>> #Association query: Two tables, one to one,ref path is absolute path
>>> data ='''{
... "moment":{},
... "user":{
... "@column": "id,username,email",
... "id@": "moment/user_id"
... }
... }'''
>>> r = handler.post('/apijson/get', data=data, pre_call=pre_call_as("admin"), middlewares=[])
>>> d = json_loads(r.data)
>>> print(d)
{'code': 200, 'msg': 'success', 'moment': {'user_id': 2, 'date': '2018-11-01 00:00:00', 'content': 'test moment', 'picture_list': '[]', 'id': 1}, 'user': {'username': 'usera', 'email': 'usera@localhost', 'id': 2}}
>>> #Association query: Two tables, one is array, one is single, there is a abs reference to array
>>> data ='''{
... "moment[]":{"moment":{"@count":3}},
... "user":{
... "@column": "id,username,email",
... "id@": "moment[]/1/moment/user_id"
... }
... }'''
>>> r = handler.post('/apijson/get', data=data, pre_call=pre_call_as("admin"), middlewares=[])
>>> d = json_loads(r.data)
>>> print(d)
{'code': 200, 'msg': 'success', 'moment[]': [{'moment': {'user_id': 2, 'date': '2018-11-01 00:00:00', 'content': 'test moment', 'picture_list': '[]', 'id': 1}}, {'moment': {'user_id': 3, 'date': '2018-11-02 00:00:00', 'content': 'test moment from b', 'picture_list': '[]', 'id': 2}}, {'moment': {'user_id': 4, 'date': '2018-11-06 00:00:00', 'content': 'test moment from c', 'picture_list': '[]', 'id': 3}}], 'user': {'username': 'userb', 'email': 'userb@localhost', 'id': 3}}
>>> #Association query: Two tables, one is array, one is single, there is a rel reference to array
>>> data ='''{
... "moment[]":{"moment":{"@count":3}},
... "user":{
... "@column": "id,username,email",
... "id@": "/moment[]/1/moment/user_id"
... }
... }'''
>>> r = handler.post('/apijson/get', data=data, pre_call=pre_call_as("admin"), middlewares=[])
>>> d = json_loads(r.data)
>>> print(d)
{'code': 200, 'msg': 'success', 'moment[]': [{'moment': {'user_id': 2, 'date': '2018-11-01 00:00:00', 'content': 'test moment', 'picture_list': '[]', 'id': 1}}, {'moment': {'user_id': 3, 'date': '2018-11-02 00:00:00', 'content': 'test moment from b', 'picture_list': '[]', 'id': 2}}, {'moment': {'user_id': 4, 'date': '2018-11-06 00:00:00', 'content': 'test moment from c', 'picture_list': '[]', 'id': 3}}], 'user': {'username': 'userb', 'email': 'userb@localhost', 'id': 3}}
>>> #Association query: Two tables, one to one,ref path is relative path
>>> data ='''{
... "moment":{},
... "user":{
... "@column": "id,username,email",
... "id@": "/moment/user_id"
... }
... }'''
>>> r = handler.post('/apijson/get', data=data, pre_call=pre_call_as("admin"), middlewares=[])
>>> d = json_loads(r.data)
>>> print(d)
{'code': 200, 'msg': 'success', 'moment': {'user_id': 2, 'date': '2018-11-01 00:00:00', 'content': 'test moment', 'picture_list': '[]', 'id': 1}, 'user': {'username': 'usera', 'email': 'usera@localhost', 'id': 2}}
"""
def test_apijson_head():
"""
>>> application = make_simple_application(project_dir='.')
>>> handler = application.handler()
>>> #apijson head
>>> data ='''{
... "moment": {
... "user_id": 2
... }
... }'''
>>> r = handler.post('/apijson/head', data=data, pre_call=pre_call_as("admin"), middlewares=[])
>>> d = json_loads(r.data)
>>> print(d)
{'code': 200, 'msg': 'success', 'moment': {'code': 200, 'msg': 'success', 'count': 1}}
>>> #apijson head, with a nonexistant model
>>> data ='''{
... "nonexist": {
... "user_id": 2
... }
... }'''
>>> r = handler.post('/apijson/head', data=data, pre_call=pre_call_as("admin"), middlewares=[])
>>> d = json_loads(r.data)
>>> print(d)
{'code': 400, 'msg': "model 'nonexist' not found"}
>>> #apijson head, without permission of HEAD
>>> data ='''{
... "privacy": {
... "@role":"LOGIN",
... "id": 1
... }
... }'''
>>> r = handler.post('/apijson/head', data=data, pre_call=pre_call_as("admin"), middlewares=[])
>>> d = json_loads(r.data)
>>> print(d)
{'code': 400, 'msg': "role 'LOGIN' not have permission HEAD for 'privacy'"}
>>> #apijson head, without user
>>> data ='''{
... "privacy": {
... "@role":"ADMIN",
... "id": 1
... }
... }'''
>>> r = handler.post('/apijson/head', data=data, middlewares=[])
>>> d = json_loads(r.data)
>>> print(d)
{'code': 400, 'msg': "user doesn't have role 'ADMIN'"}
>>> #apijson head, without user and @role
>>> data ='''{
... "privacy": {
... "id": 1
... }
... }'''
>>> r = handler.post('/apijson/head', data=data, middlewares=[])
>>> d = json_loads(r.data)
>>> print(d)
{'code': 400, 'msg': "role 'UNKNOWN' not have permission HEAD for 'privacy'"}
>>> #apijson head, user don't have role
>>> data ='''{
... "privacy": {
... "@role":"ADMIN",
... "id": 1
... }
... }'''
>>> r = handler.post('/apijson/head', data=data, pre_call=pre_call_as("usera"), middlewares=[])
>>> d = json_loads(r.data)
>>> print(d)
{'code': 400, 'msg': "user doesn't have role 'ADMIN'"}
>>> #apijson head, with OWNER
>>> data ='''{
... "moment": {
... "@role":"OWNER"
... }
... }'''
>>> r = handler.post('/apijson/head', data=data, pre_call=pre_call_as("usera"), middlewares=[])
Moment: owner_condition
>>> d = json_loads(r.data)
>>> print(d)
{'code': 200, 'msg': 'success', 'moment': {'code': 200, 'msg': 'success', 'count': 1}}
>>> #apijson head, with OWNER but cannot filter with OWNER
>>> data ='''{
... "publicnotice": {
... "@role":"OWNER"
... }
... }'''
>>> r = handler.post('/apijson/head', data=data, pre_call=pre_call_as("usera"), middlewares=[])
>>> d = json_loads(r.data)
>>> print(d)
{'code': 400, 'msg': "'publicnotice' cannot filter with owner"}
>>> #apijson head, with a nonexistant column
>>> data ='''{
... "moment": {
... "nonexist": 2
... }
... }'''
>>> r = handler.post('/apijson/head', data=data, pre_call=pre_call_as("admin"), middlewares=[])
>>> d = json_loads(r.data)
>>> print(d)
{'code': 400, 'msg': "'moment' don't have field 'nonexist'"}
"""
def test_apijson_post():
"""
>>> application = make_simple_application(project_dir='.')
>>> handler = application.handler()
>>> #apijson post, without @tag
>>> data ='''{
... "moment": {
... "content": "new moment for test",
... "picture_list": ["http://static.oschina.net/uploads/user/48/96331_50.jpg"]
... }
... }'''
>>> r = handler.post('/apijson/post', data=data, pre_call=pre_call_as("admin"), middlewares=[])
>>> d = json_loads(r.data)
>>> print(d)
{'code': 400, 'msg': "'tag' parameter is needed"}
>>> #apijson post
>>> data ='''{
... "moment": {
... "content": "new moment for test",
... "picture_list": ["http://static.oschina.net/uploads/user/48/96331_50.jpg"]
... },
... "@tag": "moment"
... }'''
>>> r = handler.post('/apijson/post', data=data, pre_call=pre_call_as("admin"), middlewares=[])
>>> d = json_loads(r.data)
>>> print(d)
{'code': 200, 'msg': 'success', 'moment': {'id': 4, 'count': 1, 'code': 200, 'message': 'success'}}
>>> #apijson post to a non exist model
>>> data ='''{
... "nonexist": {
... "content": "new moment for test",
... "picture_list": ["http://static.oschina.net/uploads/user/48/96331_50.jpg"]
... },
... "@tag": "nonexist"
... }'''
>>> r = handler.post('/apijson/post', data=data, pre_call=pre_call_as("admin"), middlewares=[])
>>> d = json_loads(r.data)
>>> print(d)
{'code': 400, 'msg': "model 'nonexist' not found"}
>>> #apijson post, tag is model which not define in APIJSON_REQUESTS
>>> data ='''{
... "moment": {
... "content": "new moment for test",
... "picture_list": ["http://static.oschina.net/uploads/user/48/96331_50.jpg"]
... },
... "@tag": "role"
... }'''
>>> r = handler.post('/apijson/post', data=data, pre_call=pre_call_as("admin"), middlewares=[])
>>> d = json_loads(r.data)
>>> print(d)
{'code': 400, 'msg': "tag 'role' not found"}
>>> #apijson post, tag is model which not define in APIJSON_REQUESTS
>>> data ='''{
... "user": {
... "username": "test"
... },
... "@tag": "user"
... }'''
>>> r = handler.post('/apijson/post', data=data, pre_call=pre_call_as("admin"), middlewares=[])
>>> d = json_loads(r.data)
>>> print(d)
{'code': 400, 'msg': "tag 'user' not found"}
"""
def test_apijson_put():
"""
>>> application = make_simple_application(project_dir='.')
>>> handler = application.handler()
>>> #apijson put
>>> data ='''{
... "moment": {
... "id": 1,
... "content": "moment content after change"
... },
... "@tag": "moment"
... }'''
>>> r = handler.post('/apijson/put', data=data, pre_call=pre_call_as("usera"), middlewares=[])
>>> d = json_loads(r.data)
>>> print(d)
{'code': 200, 'msg': 'success', 'moment': {'id': 1, 'code': 200, 'msg': 'success', 'count': 1}}
>>> #apijson put, with @role
>>> data ='''{
... "moment": {
... "@role": "ADMIN",
... "id": 1,
... "content": "moment content after change 2"
... },
... "@tag": "moment"
... }'''
>>> r = handler.post('/apijson/put', data=data, pre_call=pre_call_as("admin"), middlewares=[])
>>> d = json_loads(r.data)
>>> print(d)
{'code': 200, 'msg': 'success', 'moment': {'id': 1, 'code': 200, 'msg': 'success', 'count': 1}}
>>> #apijson put, model not exists
>>> data ='''{
... "nonexist": {
... "@role": "ADMIN",
... "id": 1,
... "content": "moment content after change 2"
... },
... "@tag": "nonexist"
... }'''
>>> r = handler.post('/apijson/put', data=data, pre_call=pre_call_as("admin"), middlewares=[])
>>> d = json_loads(r.data)
>>> print(d)
{'code': 400, 'msg': "model 'nonexist' not found"}
>>> #apijson put, with a model no tag
>>> data ='''{
... "norequesttag": {
... "user_id": 1,
... "content": "test"
... },
... "@tag": "norequesttag"
... }'''
>>> r = handler.post('/apijson/put', data=data, pre_call=pre_call_as("usera"), middlewares=[])
>>> d = json_loads(r.data)
>>> print(d)
{'code': 400, 'msg': "tag 'norequesttag' not found"}
>>> #apijson put, test ADD in put
>>> data ='''{
... "moment": {
... "id": 2,
... "content": "moment content after change"
... },
... "@tag": "moment"
... }'''
>>> r = handler.post('/apijson/put', data=data, pre_call=pre_call_as("usera"), middlewares=[])
>>> d = json_loads(r.data)
>>> print(d)
{'code': 400, 'msg': 'no permission'}
>>> #apijson put, without id
>>> data ='''{
... "moment": {
... "content": "moment content after change"
... },
... "@tag": "moment"
... }'''
>>> r = handler.post('/apijson/put', data=data, pre_call=pre_call_as("usera"), middlewares=[])
>>> d = json_loads(r.data)
>>> print(d)
{'code': 400, 'msg': 'id param needed'}
>>> #apijson put, with id not integer
>>> data ='''{
... "moment": {
... "id": "abc",
... "content": "moment content after change"
... },
... "@tag": "moment"
... }'''
>>> r = handler.post('/apijson/put', data=data, pre_call=pre_call_as("usera"), middlewares=[])
>>> d = json_loads(r.data)
>>> print(d)
{'code': 400, 'msg': "id 'abc' cannot convert to integer"}
>>> #apijson put, with a id cannot find record
>>> data ='''{
... "moment": {
... "id": 100,
... "content": "moment content after change"
... },
... "@tag": "moment"
... }'''
>>> r = handler.post('/apijson/put', data=data, pre_call=pre_call_as("usera"), middlewares=[])
>>> d = json_loads(r.data)
>>> print(d)
{'code': 400, 'msg': "cannot find record which id = '100'"}
>>> #apijson put, with a role which have no permission
>>> data ='''{
... "moment": {
... "@role": "LOGIN",
... "id": 1,
... "content": "moment content after change"
... },
... "@tag": "moment"
... }'''
>>> r = handler.post('/apijson/put', data=data, pre_call=pre_call_as("usera"), middlewares=[])
>>> d = json_loads(r.data)
>>> print(d)
{'code': 400, 'msg': "'moment' not accessible by role 'LOGIN'"}
>>> #apijson put, with UNKNOWN role
>>> data ='''{
... "publicnotice": {
... "@role": "UNKNOWN",
... "id": 1,
... "content": "content after change"
... },
... "@tag": "publicnotice"
... }'''
>>> r = handler.post('/apijson/put', data=data, pre_call=pre_call_as("usera"), middlewares=[])
>>> d = json_loads(r.data)
>>> print(d)
{'code': 200, 'msg': 'success', 'publicnotice': {'id': 1, 'code': 200, 'msg': 'success', 'count': 1}}
>>> #apijson put, OWNER but not login
>>> data ='''{
... "moment": {
... "id": 1,
... "content": "moment content after change"
... },
... "@tag": "moment"
... }'''
>>> r = handler.post('/apijson/put', data=data, middlewares=[])
>>> d = json_loads(r.data)
>>> print(d)
{'code': 400, 'msg': "'OWNER' need login user"}
>>> #apijson put, with a role not permission
>>> data ='''{
... "moment": {
... "@role": "superuser",
... "id": 1,
... "content": "moment content after change"
... },
... "@tag": "moment"
... }'''
>>> r = handler.post('/apijson/put', data=data, pre_call=pre_call_as("admin"), middlewares=[])
>>> d = json_loads(r.data)
>>> print(d)
{'code': 400, 'msg': "'moment' not accessible by role 'superuser'"}
>>> #apijson put, with a field DISALLOWed
>>> data ='''{
... "comment": {
... "id": 2,
... "user_id": 2,
... "content": "content after change"
... },
... "@tag": "comment"
... }'''
>>> r = handler.post('/apijson/put', data=data, pre_call=pre_call_as("usera"), middlewares=[])
>>> d = json_loads(r.data)
>>> print(d)
{'code': 400, 'msg': "request 'comment' disallow 'user_id'"}
>>> #apijson put, without a field in NECESSARY
>>> data ='''{
... "moment": {
... "id": 1
... },
... "@tag": "moment"
... }'''
>>> r = handler.post('/apijson/put', data=data, pre_call=pre_call_as("usera"), middlewares=[])
>>> d = json_loads(r.data)
>>> print(d)
{'code': 400, 'msg': "request 'moment' have not necessary field 'content'"}
>>> #apijson put, with a non exist field
>>> data ='''{
... "moment": {
... "id": 1,
... "content": "moment content after change",
... "noexist": "test"
... },
... "@tag": "moment"
... }'''
>>> r = handler.post('/apijson/put', data=data, pre_call=pre_call_as("usera"), middlewares=[])
>>> d = json_loads(r.data)
>>> print(d)
{'code': 400, 'msg': "'moment' don't have field 'noexist'"}
>>> #apijson put, and check get result
>>> data ='''{
... "moment": {
... "id": 1,
... "content": "check 789"
... },
... "@tag": "moment"
... }'''
>>> r = handler.post('/apijson/put', data=data, pre_call=pre_call_as("usera"), middlewares=[])
>>> d = json_loads(r.data)
>>> print(d)
{'code': 200, 'msg': 'success', 'moment': {'id': 1, 'code': 200, 'msg': 'success', 'count': 1}}
>>> data ='''{
... "moment":{
... "id": %s
... }
... }'''%(d['moment']['id'])
>>> r = handler.post('/apijson/get', data=data, pre_call=pre_call_as("usera"), middlewares=[])
>>> d = json_loads(r.data)
>>> print(d)
{'code': 200, 'msg': 'success', 'moment': {'user_id': 2, 'date': '2018-11-01 00:00:00', 'content': 'check 789', 'picture_list': '[]', 'id': 1}}
>>> #apijson put, and check get result
>>> data ='''{
... "moment": {
... "id": 1,
... "content": "check 789"
... },
... "@tag": "moment"
... }'''
>>> r = handler.post('/apijson/put', data=data, pre_call=pre_call_as("usera"), middlewares=[])
>>> d = json_loads(r.data)
>>> print(d)
{'code': 400, 'msg': 'failed when updating, maybe no change', 'moment': {'id': 1, 'code': 400, 'msg': 'failed when updating, maybe no change', 'count': 0}}
"""
def test_apijson_delete():
"""
>>> application = make_simple_application(project_dir='.')
>>> handler = application.handler()
>>> #apijson delete
>>> data ='''{
... "moment": {
... "id": 1
... },
... "@tag": "moment"
... }'''
>>> r = handler.post('/apijson/delete', data=data, pre_call=pre_call_as("usera"), middlewares=[])
>>> d = json_loads(r.data)
>>> print(d)
{'code': 200, 'msg': 'success', 'moment': {'id': 1, 'code': 200, 'message': 'success', 'count': 1}}
>>> data ='''{
... "moment": {
... "id": 1
... }
... }'''
>>> r = handler.post('/apijson/get', data=data, pre_call=pre_call_as("usera"), middlewares=[])
>>> d = json_loads(r.data)
>>> print(d)
{'code': 200, 'msg': 'success', 'moment': None}
>>> #apijson delete, without @tag
>>> data ='''{
... "moment": {
... "content": "new moment for test"
... },
... "@tag": "moment"
... }'''
>>> r = handler.post('/apijson/post', data=data, pre_call=pre_call_as("usera"), middlewares=[])
>>> d = json_loads(r.data)
>>> data ='''{
... "moment": {
... "id": %s
... }
... }'''%(d["moment"]["id"])
>>> r = handler.post('/apijson/delete', data=data, pre_call=pre_call_as("usera"), middlewares=[])
>>> d = json_loads(r.data)
>>> print(d)
{'code': 400, 'msg': "'tag' parameter is needed"}
>>> #apijson delete, with non exist model
>>> data ='''{
... "nonexist": {
... "id": 1
... },
... "@tag": "nonexist"
... }'''
>>> r = handler.post('/apijson/delete', data=data, pre_call=pre_call_as("usera"), middlewares=[])
>>> d = json_loads(r.data)
>>> print(d)
{'code': 400, 'msg': "model 'nonexist' not found"}
>>> #apijson delete, try to delete other's moment
>>> data ='''{
... "moment": {
... "id": 2
... },
... "@tag": "moment"
... }'''
>>> r = handler.post('/apijson/delete', data=data, pre_call=pre_call_as("usera"), middlewares=[])
>>> d = json_loads(r.data)
>>> print(d)
{'code': 400, 'msg': 'no role to access the data'}
>>> #apijson delete, without id
>>> data ='''{
... "moment": {
... },
... "@tag": "moment"
... }'''
>>> r = handler.post('/apijson/delete', data=data, pre_call=pre_call_as("usera"), middlewares=[])
>>> d = json_loads(r.data)
>>> print(d)
{'code': 400, 'msg': 'id param needed'}
>>> #apijson delete, id not int
>>> data ='''{
... "moment": {
... "id": "abc"
... },
... "@tag": "moment"
... }'''
>>> r = handler.post('/apijson/delete', data=data, pre_call=pre_call_as("usera"), middlewares=[])
>>> d = json_loads(r.data)
>>> print(d)
{'code': 400, 'msg': "id 'abc' cannot convert to integer"}
>>> #apijson delete
>>> data ='''{
... "moment": {
... "id": 100
... },
... "@tag": "moment"
... }'''
>>> r = handler.post('/apijson/delete', data=data, pre_call=pre_call_as("usera"), middlewares=[])
>>> d = json_loads(r.data)
>>> print(d)
{'code': 400, 'msg': "cannot find record id = '100'"}
>>> #apijson delete, with a role having no permission
>>> data ='''{
... "moment": {
... "content": "new moment for test"
... },
... "@tag": "moment"
... }'''
>>> r = handler.post('/apijson/post', data=data, pre_call=pre_call_as("usera"), middlewares=[])
>>> d = json_loads(r.data)
>>> data ='''{
... "moment": {
... "@role": "UNKNOWN",
... "id": %s
... },
... "@tag": "moment"
... }'''%(d["moment"]["id"])
>>> r = handler.post('/apijson/delete', data=data, pre_call=pre_call_as("usera"), middlewares=[])
>>> d = json_loads(r.data)
>>> print(d)
{'code': 400, 'msg': "role 'UNKNOWN' has no permission to access the data"}
>>> #apijson delete, with OWNER but not login
>>> data ='''{
... "moment": {
... "content": "new moment for test"
... },
... "@tag": "moment"
... }'''
>>> r = handler.post('/apijson/post', data=data, pre_call=pre_call_as("usera"), middlewares=[])
>>> d = json_loads(r.data)
>>> data ='''{
... "moment": {
... "id": %s
... },
... "@tag": "moment"
... }'''%(d["moment"]["id"])
>>> r = handler.post('/apijson/delete', data=data, middlewares=[])
>>> d = json_loads(r.data)
>>> print(d)
{'code': 400, 'msg': 'no role to access the data'}
>>> #apijson delete, with UNKNOWN role
>>> data ='''{
... "publicnotice": {
... "@role": "UNKNOWN",
... "id": 1
... },
... "@tag": "publicnotice"
... }'''
>>> r = handler.post('/apijson/delete', data=data, middlewares=[])
>>> d = json_loads(r.data)
>>> print(d)
{'code': 200, 'msg': 'success', 'publicnotice': {'id': 1, 'code': 200, 'message': 'success', 'count': 1}}
>>> #apijson delete, with a role which have no permission
>>> data ='''{
... "moment": {
... "content": "new moment for test"
... },
... "@tag": "moment"
... }'''
>>> r = handler.post('/apijson/post', data=data, pre_call=pre_call_as("usera"), middlewares=[])
>>> d = json_loads(r.data)
>>> data ='''{
... "moment": {
... "@role": "superuser",
... "id": %s
... },
... "@tag": "moment"
... }'''%(d["moment"]["id"])
>>> r = handler.post('/apijson/delete', data=data, pre_call=pre_call_as("admin"), middlewares=[])
>>> d = json_loads(r.data)
>>> print(d)
{'code': 400, 'msg': "role 'superuser' has no permission to access the data"}
"""
def test_apijson_permission():
"""
>>> application = make_simple_application(project_dir='.')
>>> handler = application.handler()
>>> #apijson get, query with id, access with owner
>>> data ='''{
... "comment2":{
... "id": 1
... }
... }'''
>>> r = handler.post('/apijson/get', data=data, pre_call=pre_call_as("admin"), middlewares=[])
>>> d = json_loads(r.data)
>>> print(d)
{'code': 200, 'msg': 'success', 'comment2': {'user_id': 1, 'to_id': 3, 'moment_id': 1, 'date': '2018-11-01 00:00:00', 'content': 'comment from admin', 'id': 1}}
>>> #apijson get, query with id, access other's comment, expect empty result
>>> data ='''{
... "comment2":{
... "id": 1
... }
... }'''
>>> r = handler.post('/apijson/get', data=data, pre_call=pre_call_as("userb"), middlewares=[])
>>> d = json_loads(r.data)
>>> print(d)
{'code': 200, 'msg': 'success', 'comment2': None}
>>> #apijson get, query array
>>> data ='''{
... "comment2":{
... }
... }'''
>>> r = handler.post('/apijson/get', data=data, pre_call=pre_call_as("usera"), middlewares=[])
>>> d = json_loads(r.data)
>>> print(d)
{'code': 200, 'msg': 'success', 'comment2': {'user_id': 2, 'to_id': 3, 'moment_id': 1, 'date': '2018-12-01 00:00:00', 'content': 'comment from usera to userb', 'id': 2}}
>>> #apijson get, query one with admin as OWNER
>>> data ='''{
... "comment2":{
... "@role":"OWNER"
... }
... }'''
>>> r = handler.post('/apijson/get', data=data, pre_call=pre_call_as("admin"), middlewares=[])
>>> d = json_loads(r.data)
>>> print(d)
{'code': 200, 'msg': 'success', 'comment2': {'user_id': 1, 'to_id': 3, 'moment_id': 1, 'date': '2018-11-01 00:00:00', 'content': 'comment from admin', 'id': 1}}
>>> #apijson get, query one with admin as ADMIN
>>> data ='''{
... "comment2":{
... "@role":"ADMIN",
... "user_id": 2
... }
... }'''
>>> r = handler.post('/apijson/get', data=data, pre_call=pre_call_as("admin"), middlewares=[])
>>> d = json_loads(r.data)
>>> print(d)
{'code': 200, 'msg': 'success', 'comment2': {'user_id': 2, 'to_id': 3, 'moment_id': 1, 'date': '2018-12-01 00:00:00', 'content': 'comment from usera to userb', 'id': 2}}
>>> #apijson get, query array
>>> data ='''{
... "[]":{
... "comment2": {"@role":"ADMIN"}
... }
... }'''
>>> r = handler.post('/apijson/get', data=data, pre_call=pre_call_as("admin"), middlewares=[])
>>> d = json_loads(r.data)
>>> print(d)
{'code': 200, 'msg': 'success', '[]': [{'comment2': {'user_id': 1, 'to_id': 3, 'moment_id': 1, 'date': '2018-11-01 00:00:00', 'content': 'comment from admin', 'id': 1}}, {'comment2': {'user_id': 2, 'to_id': 3, 'moment_id': 1, 'date': '2018-12-01 00:00:00', 'content': 'comment from usera to userb', 'id': 2}}, {'comment2': {'user_id': 3, 'to_id': 2, 'moment_id': 2, 'date': '2018-12-02 00:00:00', 'content': 'comment from userb to usera', 'id': 3}}, {'comment2': {'user_id': 4, 'to_id': 2, 'moment_id': 3, 'date': '2018-12-09 00:00:00', 'content': 'comment from userc to usera', 'id': 4}}]}
>>> #apijson head
>>> data ='''{
... "comment2": {
... "user_id": 1
... }
... }'''
>>> r = handler.post('/apijson/head', data=data, pre_call=pre_call_as("userc"), middlewares=[])
>>> d = json_loads(r.data)
>>> print(d)
{'code': 200, 'msg': 'success', 'comment2': {'code': 200, 'msg': 'success', 'count': 0}}
>>> #apijson delete with a user which have no permission
>>> data ='''{
... "comment2": {
... "id": 1
... },
... "@tag": "comment2"
... }'''
>>> r = handler.post('/apijson/delete', data=data, pre_call=pre_call_as("userc"), middlewares=[])
>>> d = json_loads(r.data)
>>> print(d)
{'code': 400, 'msg': 'no permission'}
>>> #apijson delete with permission, ADMIN
>>> data ='''{
... "comment2": {
... "id": 1
... },
... "@tag": "comment2"
... }'''
>>> r = handler.post('/apijson/delete', data=data, pre_call=pre_call_as("admin"), middlewares=[])
>>> d = json_loads(r.data)
>>> print(d)
{'code': 200, 'msg': 'success', 'comment2': {'id': 1, 'code': 200, 'message': 'success', 'count': 1}}
"""
Loading...
马建仓 AI 助手
尝试更多
代码解读
代码找茬
代码优化
Python
1
https://gitee.com/APIJSON/APIJSON-Python.git
git@gitee.com:APIJSON/APIJSON-Python.git
APIJSON
APIJSON-Python
APIJSON-Python
master

搜索帮助