2017-05-26 51 views
6

Buduję strukturę Django Rest i chcę przetestować bibliotekę API z coreapi. Mogę utworzyć obiekt przy użyciu programu coreapi programowo wewnątrz skryptu Pythona, ale w wierszu poleceń nie mogę utworzyć tego samego obiektu, a kiedy wyświetlam listę punktów końcowych coreapi, otrzymuję listę z punktami końcowymi tylko do odczytu i wyświetlania, nawet gdy dodaję prawidłowe poświadczenia .coreapi wyświetla listę tylko do odczytu i odczytu, nawet jeśli użytkownik jest zalogowany

moim schemacie:

{ 
    "_type": "document", 
    "_meta": { 
     "url": "http://127.0.0.1:8000/api/schema/", 
     "title": "NEP API" 
    }, 
    "experiments": { 

     "list": { 
      "_type": "link", 
      "url": "/api/experiments/", 
      "action": "get", 
      "fields": [ 
       { 
        "name": "page", 
        "location": "query", 
        "schema": { 
         "_type": "integer", 
         "title": "Page", 
         "description": "A page number within the paginated result set." 
        } 
       } 
      ] 
     }, 
     "create": { 
      "_type": "link", 
      "url": "/api/experiments/", 
      "action": "post", 
      "encoding": "application/json", 
      "fields": [ 
       { 
        "name": "title", 
        "required": true, 
        "location": "form", 
        "schema": { 
         "_type": "string", 
         "title": "Title", 
         "description": "" 
        } 
       }, 
       { 
        "name": "description", 
        "required": true, 
        "location": "form", 
        "schema": { 
         "_type": "string", 
         "title": "Description", 
         "description": "" 
        } 
       }, 
       { 
        "name": "data_acquisition_done", 
        "location": "form", 
        "schema": { 
         "_type": "boolean", 
         "title": "Data acquisition done", 
         "description": "" 
        } 
       }, 
       { 
        "name": "nes_id", 
        "required": true, 
        "location": "form", 
        "schema": { 
         "_type": "integer", 
         "title": "Nes id", 
         "description": "" 
        } 
       }, 
       { 
        "name": "ethics_committee_file", 
        "location": "form", 
        "schema": { 
         "_type": "string", 
         "title": "Project file approved by the ethics committee", 
         "description": "" 
        } 
       }, 
       { 
        "name": "sent_date", 
        "required": true, 
        "location": "form", 
        "schema": { 
         "_type": "string", 
         "title": "Sent date", 
         "description": "" 
        } 
       } 
      ] 
     }, 
     "read": { 
      "_type": "link", 
      "url": "/api/experiments/{nes_id}/", 
      "action": "get", 
      "fields": [ 
       { 
        "name": "nes_id", 
        "required": true, 
        "location": "path", 
        "schema": { 
         "_type": "string", 
         "title": "", 
         "description": "" 
        } 
       } 
      ] 
     }, 
     "update": { 
      "_type": "link", 
      "url": "/api/experiments/{nes_id}/", 
      "action": "put", 
      "encoding": "application/json", 
      "fields": [ 
       { 
        "name": "nes_id", 
        "required": true, 
        "location": "path", 
        "schema": { 
         "_type": "string", 
         "title": "", 
         "description": "" 
        } 
       }, 
       { 
        "name": "title", 
        "required": true, 
        "location": "form", 
        "schema": { 
         "_type": "string", 
         "title": "Title", 
         "description": "" 
        } 
       }, 
       { 
        "name": "description", 
        "required": true, 
        "location": "form", 
        "schema": { 
         "_type": "string", 
         "title": "Description", 
         "description": "" 
        } 
       }, 
       { 
        "name": "data_acquisition_done", 
        "location": "form", 
        "schema": { 
         "_type": "boolean", 
         "title": "Data acquisition done", 
         "description": "" 
        } 
       }, 
       { 
        "name": "nes_id", 
        "required": true, 
        "location": "form", 
        "schema": { 
         "_type": "integer", 
         "title": "Nes id", 
         "description": "" 
        } 
       }, 
       { 
        "name": "ethics_committee_file", 
        "location": "form", 
        "schema": { 
         "_type": "string", 
         "title": "Project file approved by the ethics committee", 
         "description": "" 
        } 
       }, 
       { 
        "name": "sent_date", 
        "required": true, 
        "location": "form", 
        "schema": { 
         "_type": "string", 
         "title": "Sent date", 
         "description": "" 
        } 
       } 
      ] 
     }, 
     "partial_update": { 
      "_type": "link", 
      "url": "/api/experiments/{nes_id}/", 
      "action": "patch", 
      "encoding": "application/json", 
      "fields": [ 
       { 
        "name": "nes_id", 
        "required": true, 
        "location": "path", 
        "schema": { 
         "_type": "string", 
         "title": "", 
         "description": "" 
        } 
       }, 
       { 
        "name": "title", 
        "location": "form", 
        "schema": { 
         "_type": "string", 
         "title": "Title", 
         "description": "" 
        } 
       }, 
       { 
        "name": "description", 
        "location": "form", 
        "schema": { 
         "_type": "string", 
         "title": "Description", 
         "description": "" 
        } 
       }, 
       { 
        "name": "data_acquisition_done", 
        "location": "form", 
        "schema": { 
         "_type": "boolean", 
         "title": "Data acquisition done", 
         "description": "" 
        } 
       }, 
       { 
        "name": "nes_id", 
        "location": "form", 
        "schema": { 
         "_type": "integer", 
         "title": "Nes id", 
         "description": "" 
        } 
       }, 
       { 
        "name": "ethics_committee_file", 
        "location": "form", 
        "schema": { 
         "_type": "string", 
         "title": "Project file approved by the ethics committee", 
         "description": "" 
        } 
       }, 
       { 
        "name": "sent_date", 
        "location": "form", 
        "schema": { 
         "_type": "string", 
         "title": "Sent date", 
         "description": "" 
        } 
       } 
      ] 
     }, 
     "delete": { 
      "_type": "link", 
      "url": "/api/experiments/{nes_id}/", 
      "action": "delete", 
      "fields": [ 
       { 
        "name": "nes_id", 
        "required": true, 
        "location": "path", 
        "schema": { 
         "_type": "string", 
         "title": "", 
         "description": "" 
        } 
       } 
      ] 
     } 
    }, 
} 

Jak widać, wszystkie metody są wymienione tutaj i nie mogę utworzyć experiment obiektu przy użyciu coreapi programowo wewnątrz skryptu, na przykład, działa (wewnątrz skryptu Pythona) :

client.action(
     schema, ['experiments', 'create'], 
     params={'title': 'An experimet', 'description': 'A description', 
       'nes_id': 2, 'sent_date': '2017-01-01'} 
    ) 

Ale podczas korzystania coreapi w wierszu poleceń nie można utworzyć tego samego obiektu.

Getting schematu:

$ coreapi get http://127.0.0.1:8000/api/schema 

Wyświetlanie i punkty, gdy nie jest zalogowany:

<NEP API "http://127.0.0.1:8000/api/schema/"> 
    experiments: { 
     groups: { 
      list(experiment_nes_id, [page]) 
     } 
     studies: { 
      list(experiment_nes_id, [page]) 
     } 
     list([page]) 
     read(nes_id) 
    } 
    groups: { 
     list([page]) 
    } 
    protocol_components: { 
     list([page]) 
     read(nes_id) 
    } 
    studies: { 
     list([page]) 
    } 

Następnie dodaję moje referencje:

$ coreapi credentials add 127.0.0.1 "lab1":"nep-lab1" --auth basic 

Odśwież schematu:

$ coreapi reload 

a wynik jest ponownie

<NEP API "http://127.0.0.1:8000/api/schema/"> 
    experiments: { 
     groups: { 
      list(experiment_nes_id, [page]) 
     } 
     studies: { 
      list(experiment_nes_id, [page]) 
     } 
     list([page]) 
     read(nes_id) 
    } 
    groups: { 
     list([page]) 
    } 
    protocol_components: { 
     list([page]) 
     read(nes_id) 
    } 
    studies: { 
     list([page]) 
    } 

Teraz spodziewam się, że pojawią się punkty końcowe w tym tworzenie, aktualizowanie itp ale nie.

A kiedy próby utworzenia działającej experiment obiektu:

$ coreapi action experiments create --param nes_id=5 --param title="A" --param description="B" --param sent_date="2001-01-01" 

dostaję, zgodnie z oczekiwaniami:

Index ['experiments']['create'] did not reference a link. Key 'create' was not found. 

url conf:

używam domyślnego routera do generowanie URU RESTU:

router.register(r'experiments', api.ExperimentViewSet, 
       base_name='api_experiments') 
router = DefaultRouter() 

włącznie w url conf:

url(r'^', include(router.urls)), 

Niestety przez długi tekst. Chciałem uwzględnić tyle, ile informacje uważałem za konieczne.

Odpowiedz

8

Miał ten sam problem podczas pracy nad samouczkiem (część 7) w oficjalnej witrynie Django Rest Framework.

Znaleziono jedno rozwiązanie: ręcznie dodać nagłówek Authorization do wniosków korzystających coreapi headers add HEADER VALUE, gdzie VALUE to ciąg znaków, który jest generowany podczas dodawania poświadczeń użytkownika. Z jakiegoś powodu mój coreapi nie dodał automatycznie tego nagłówka, aby uzyskać żądanie znalezione z opcją --debug.

Oto przykład:

Przed poświadczenia dodaje widzę tylko bezpiecznych metod:

$ coreapi get http://127.0.0.1:8000/schema/ 
<Pastebin API "http://127.0.0.1:8000/schema/"> 
    snippets: { 
     list([page]) 
     read(id) 
     highlight(id) 
    } 
    users: { 
     list([page]) 
     read(id) 
    } 

Potem dodać poświadczeń administratora Administrator:

coreapi credentials add 127.0.0.1 "admin:password" --auth basic 
Added credentials 
127.0.0.1 "Basic BlahBlahBlah=" 

to wygląda coreapi z powodzeniem dodaje referencje, ale kiedy próbuję przeładować schemat, nadal otrzymuję te same metody:

$ coreapi reload 
<Pastebin API "http://127.0.0.1:8000/schema/"> 
    snippets: { 
     list([page]) 
     read(id) 
     highlight(id) 
    } 
    users: { 
     list([page]) 
     read(id) 
    } 

I stwierdził, że nie ma Authorization nagłówek w żądaniu GET o wartości Basic BlahBlahBlah=:

$ coreapi reload --debug 
> GET /schema/ HTTP/1.1 
> Accept-Encoding: gzip, deflate 
> Connection: keep-alive 
> Accept: application/coreapi+json, application/vnd.coreapi+json, */* 
> Host: 127.0.0.1 
> User-Agent: coreapi 

Cóż, spróbujmy dodać ten nagłówek na naszą prośbę ręcznie:

$ coreapi headers add "Authorization" "Basic BlahBlahBlah=" 
Added header 
Authorization: Basic BlahBlahBlah= 

Spróbuj ponownie aby uzyskać schemat:

$ coreapi get http://127.0.0.1:8000/schema/ 
<Pastebin API "http://127.0.0.1:8000/schema/"> 
    snippets: { 
     list([page]) 
     create(code, [title], [linenos], [language], [style]) 
     read(id) 
     update(id, code, [title], [linenos], [language], [style]) 
     partial_update(id, [title], [code], [linenos], [language], [style]) 
     delete(id) 
     highlight(id) 
    } 
    users: { 
     list([page]) 
     read(id) 
    } 

Teraz widzę wszystkie inne metody dostępne tylko dla autoryzowanych użytkowników. Jeśli mogę wykonać poprzednie polecenie z --debug opcji, nie będzie nagłówek:

> GET /schema/ HTTP/1.1 
> Accept-Encoding: gzip, deflate 
> Connection: keep-alive 
> Accept: application/coreapi+json, application/vnd.coreapi+json, */* 
> Authorization: Basic BlahBlahBlah= 
> Host: 127.0.0.1 
> User-Agent: coreapi 

Na przykład, teraz mogę stworzyć fragment kodu:

$ coreapi action snippets create --param title="Example" --param code="print('hello, world')" 
{ 
    "url": "http://127.0.0.1:8000/snippets/6/", 
    "id": 6, 
    "highlight": "http://127.0.0.1:8000/snippets/6/highlight/", 
    "owner": "admin", 
    "title": "Example", 
    "code": "print('hello, world')", 
    "linenos": false, 
    "language": "python", 
    "style": "friendly" 
} 

Ale nadal nie jest kwestia Dlaczego nie coreapi automatycznie dodaje nagłówek Authorization?

+0

Dziękuję za to. Podążyłem za tym samym tuto i mam ten sam problem. Nie rozwiązało to dla mnie wszystkiego, ale to dobry krok. Twoje zdrowie. – jcs

1

znalazłem dokładnie ten sam problem w tutorialu Django Reszta ramowego, więc nadal jest problem z tymi wersjami:

$ pip list 
... 
coreapi (2.3.3) 
coreapi-cli (1.0.6) 
... 

Kwestia udokumentowane tutaj: https://github.com/core-api/coreapi-cli/issues/19. Odpowiedni fragment:

coreapi-cli używa argumentu nieaktualnych poświadczeń dla HTTPTransport zamiast auth. Jak widać z tego kodu, coreapi 2.3.1 połknie tę przestarzałą argumentację, ale potem nic z nią nie zrobi. Dlatego ta biblioteka nie będzie już wysyłać nagłówków autoryzacji.

Mogę potwierdzić, że dodanie nagłówka to dla mnie. Podsumowując:

coreapi clear 
coreapi credentials add 127.0.0.1 admin:password --auth basic 
coreapi credentials show 
coreapi headers add "Authorization" "Basic ...==" 
coreapi get http://127.0.0.1:8000/schema/ --debug 

Skopiuj i wklej ciąg znaków z polecenia "poświadczenia pokazu" do polecenia "nagłówki dodaj".

0

Jest to znany błąd w wersji 2.3.x. z coreapi-cli. Poprawka jest już wkrótce, patrz:

Issue tracked on Github

Prace wokół jest jak na poprzedniej odpowiedzi Siergieja Dulevich użytkownika.