DaftAcademy / daftacademy-python_levelup-spring2020

20 stars 10 forks source link

Wykład 3 zadanie 5 - błędne statusy kodów pomimo 1 workera #33

Open Poriseler opened 4 years ago

Poriseler commented 4 years ago

Hej, 'rzutem na taśmę' postanowiłem założyć issue bo już wystrzelałem się totalnie z pomysłów. O ile pierwszy test na repl.it przechodzi elegancko, tak "get_patients" i "post_delete_patient" cały czas sypie errorami o braku odpowiedniego kodu statusu. W procfile ustawiłem, żeby działał tylko 1 worker, poprzez docsy też zwracane są odpowiednie kody. Pierwszym moim "strzałem" był case, że gdzieś po drodze (chociażby przez literówkę) gubię ciasteczko, ale w ramach sprawdzenia drukowałem je lokalnie przy otwarciu każdej podstrony i wydaje się, że problem leży jednak nie tutaj. Jakieś pomysły?

@app.get("/patient")
def show_everyone(response: Response, s_token: str = Depends(is_cookie)):
    if s_token is None:
        response.status_code = status.HTTP_401_UNAUTHORIZED
        return "You are not allowed to be here!"
    response.status_code = status.HTTP_302_FOUND
    return app.dict_of_patients

@app.delete("/patient/{id}")
def kill_him(id: int, response: Response, s_token: str = Depends(is_cookie)):
    if s_token is None:
        response.status_code = status.HTTP_401_UNAUTHORIZED
        return "You are not allowed to be here!"
    response.status_code = status.HTTP_302_FOUND
    app.dict_of_patients.pop(id, None)
Obsttube commented 4 years ago

Podaj dokładne treści błędów z repl.it oraz wstaw kawałek logów z Heroku.

Poriseler commented 4 years ago
#post_delete_patient
Traceback (most recent call last):
  File "/home/runner/unit_tests.py", line 79, in test_post_delete_patient
    self.assertTrue(r2.status_code in (300, 301, 302, 307))
AssertionError: False is not true

#get_patient(występuje z adnotacją "number of patients should be greater of 0", niezależnie od indeksowania od 0 czy 1)
Traceback (most recent call last):
  File "/home/runner/unit_tests.py", line 49, in test_get_patients
    self.assertTrue(r2.status_code in (300, 301, 302, 307))
AssertionError: False is not true

Trochę tych logów jest,co prawda, ale może da to jakiś pełniejszy obraz:

2020-04-26T20:33:07.672679+00:00 heroku[router]: at=info method=POST path="/login" host=firsttime123.herokuapp.com request_id=647b0426-972f-43d4-bee5-f559a2c9f745 fwd="46.31.39.131" dyno=web.1 connect=0ms service=3ms status=302 bytes=245 protocol=https
2020-04-26T20:33:08.605709+00:00 heroku[router]: at=info method=GET path="/welcome" host=firsttime123.herokuapp.com request_id=e84be8de-dd70-4d43-8c70-e56d4335be8e fwd="46.31.39.131" dyno=web.1 connect=0ms service=6ms status=200 bytes=300 protocol=https
2020-04-26T20:33:08.541938+00:00 app[web.1]: INFO:     46.31.39.131:0 - "POST /login HTTP/1.1" 302 Found
2020-04-26T20:33:08.604235+00:00 app[web.1]: INFO:     46.31.39.131:0 - "GET /welcome HTTP/1.1" 200 OK
2020-04-26T20:33:08.543186+00:00 heroku[router]: at=info method=POST path="/login" host=firsttime123.herokuapp.com request_id=5c5afbbc-ebf5-4a95-962f-e06b7d88600c fwd="46.31.39.131" dyno=web.1 connect=0ms service=3ms status=302 bytes=245 protocol=https
2020-04-26T20:33:30.472445+00:00 app[web.1]: INFO:     46.31.39.131:0 - "POST /patient HTTP/1.1" 302 Found
2020-04-26T20:33:30.530139+00:00 app[web.1]: INFO:     46.31.39.131:0 - "GET /patient/0 HTTP/1.1" 200 OK
2020-04-26T20:33:30.531469+00:00 heroku[router]: at=info method=GET path="/patient/0" host=firsttime123.herokuapp.com request_id=406bd46e-0248-4d8e-b256-3593f863d3e9 fwd="46.31.39.131" dyno=web.1 connect=0ms service=3ms status=200 bytes=162 protocol=https
2020-04-26T20:33:30.473714+00:00 heroku[router]: at=info method=POST path="/patient" host=firsttime123.herokuapp.com request_id=a61f0895-3b13-48e6-83d2-c915461228ce fwd="46.31.39.131" dyno=web.1 connect=0ms service=2ms status=302 bytes=153 protocol=https
2020-04-26T20:33:33.509040+00:00 app[web.1]: INFO:     46.31.39.131:0 - "POST /patient HTTP/1.1" 302 Found
2020-04-26T20:33:33.572350+00:00 app[web.1]: INFO:     46.31.39.131:0 - "GET /patient/1 HTTP/1.1" 200 OK
2020-04-26T20:33:33.515838+00:00 heroku[router]: at=info method=POST path="/patient" host=firsttime123.herokuapp.com request_id=a2e7f428-526a-4f21-b549-db545e08f00e fwd="46.31.39.131" dyno=web.1 connect=0ms service=3ms status=302 bytes=153 protocol=https
2020-04-26T20:33:33.574045+00:00 heroku[router]: at=info method=GET path="/patient/1" host=firsttime123.herokuapp.com request_id=d7e594eb-acc1-4fa4-becd-ee3f5cd68ce3 fwd="46.31.39.131" dyno=web.1 connect=0ms service=3ms status=200 bytes=164 protocol=https
2020-04-26T20:33:38.012744+00:00 app[web.1]: INFO:     46.31.39.131:0 - "POST /patient HTTP/1.1" 302 Found
2020-04-26T20:33:38.069732+00:00 app[web.1]: INFO:     46.31.39.131:0 - "GET /patient/2 HTTP/1.1" 200 OK
2020-04-26T20:33:38.014097+00:00 heroku[router]: at=info method=POST path="/patient" host=firsttime123.herokuapp.com request_id=e89898b9-6629-41ad-9c05-f04c42512f29 fwd="46.31.39.131" dyno=web.1 connect=0ms service=3ms status=302 bytes=153 protocol=https
2020-04-26T20:33:38.070988+00:00 heroku[router]: at=info method=GET path="/patient/2" host=firsttime123.herokuapp.com request_id=427e9e07-8ce8-46ae-ab89-a9d6436952df fwd="46.31.39.131" dyno=web.1 connect=0ms service=2ms status=200 bytes=161 protocol=https
2020-04-26T20:33:51.976581+00:00 app[web.1]: INFO:     46.31.39.131:0 - "GET /patient HTTP/1.1" 302 Found
2020-04-26T20:33:51.978213+00:00 heroku[router]: at=info method=GET path="/patient" host=firsttime123.herokuapp.com request_id=b915d322-1e39-4f89-8acd-426ac16bc09e fwd="46.31.39.131" dyno=web.1 connect=0ms service=3ms status=302 bytes=257 protocol=https
2020-04-26T20:34:19.693717+00:00 app[web.1]: INFO:     46.31.39.131:0 - "DELETE /patient/1 HTTP/1.1" 302 Found
2020-04-26T20:34:19.695042+00:00 heroku[router]: at=info method=DELETE path="/patient/1" host=firsttime123.herokuapp.com request_id=fdaedab2-cc90-44ac-9fb1-7d55507edae2 fwd="46.31.39.131" dyno=web.1 connect=0ms service=8ms status=302 bytes=131 protocol=https
Obsttube commented 4 years ago

Ok, przynajmniej nie ma błędów 422. Tylko tyle jest tych logów? Weź na Heroku kliknij more -> restart all dynos Następnie po restarcie odśwież repl.it i puść testy. Jak to zrobisz to wklej całe logi od linijki 2020-04-26T21:02:37.159228+00:00 app[web.1]: INFO: Uvicorn running on http://0.0.0.0:40266 (Press CTRL+C to quit)

Obsttube commented 4 years ago

W sumie nie wiem, czy taki był zamiar twórców zadania, ale ja po usunięciu elementu zwracam HTTP_204_NO_CONTENT (ty zdaje się 200). Trochę dziwny jest w tym kontekście błąd testów, który sugeruje użycie 3xx. W treści zadania nie było opisane co należy zwracać po usunięciu. Jednak na podstawie np. https://restfulapi.net/http-methods/

204 (No Content) if the action has been performed but the response does not include an entity. założyłem, że to dobre wyjście.

Nie chce mi się już sprawdzać dzisiaj, czy to jest u Ciebie problemem. Spróbuj zwracać NO CONTENT po usunięciu oraz w innych miejscach, w których jest to zasadne i daj znać, czy działa.

Poriseler commented 4 years ago

Wszytko zrobione i dalej to samo. A tutaj cały zapis logów podczas przejścia etapów start ->docs -> login -> add_patient -> add_patient ->show all -> delete_patient ->show_all

2020-04-26T21:17:59.755148+00:00 heroku[router]: at=info method=GET path="/" host=firsttime123.herokuapp.com request_id=bffec78a-6c3c-41d4-b2e7-bfa8bae76463 fwd="46.31.39.131" dyno=web.1 connect=0ms service=2ms status=200 bytes=187 protocol=https
2020-04-26T21:17:59.754065+00:00 app[web.1]: INFO:     46.31.39.131:0 - "GET / HTTP/1.1" 200 OK
2020-04-26T21:18:14.301909+00:00 heroku[router]: at=info method=GET path="/docs" host=firsttime123.herokuapp.com request_id=edeed029-7df0-4df8-aba9-5c8a0fd0a880 fwd="46.31.39.131" dyno=web.1 connect=0ms service=1ms status=200 bytes=1032 protocol=https
2020-04-26T21:18:14.300758+00:00 app[web.1]: INFO:     46.31.39.131:0 - "GET /docs HTTP/1.1" 200 OK
2020-04-26T21:18:14.534284+00:00 app[web.1]: INFO:     46.31.39.131:0 - "GET /openapi.json HTTP/1.1" 200 OK
2020-04-26T21:18:14.535474+00:00 heroku[router]: at=info method=GET path="/openapi.json" host=firsttime123.herokuapp.com request_id=3c665e9d-fc96-4f21-8702-10346c034fd8 fwd="46.31.39.131" dyno=web.1 connect=0ms service=2ms status=200 bytes=4892 protocol=https
2020-04-26T21:18:33.989762+00:00 heroku[router]: at=info method=POST path="/login" host=firsttime123.herokuapp.com request_id=1c260cb1-ad8f-4b57-9cc2-97de108c5614 fwd="46.31.39.131" dyno=web.1 connect=0ms service=3ms status=302 bytes=245 protocol=https
2020-04-26T21:18:34.043412+00:00 heroku[router]: at=info method=GET path="/welcome" host=firsttime123.herokuapp.com request_id=7d81c9c7-244c-4e7c-a8c1-d763b6f5ed9c fwd="46.31.39.131" dyno=web.1 connect=0ms service=3ms status=200 bytes=300 protocol=https
2020-04-26T21:18:33.987424+00:00 app[web.1]: INFO:     46.31.39.131:0 - "POST /login HTTP/1.1" 302 Found
2020-04-26T21:18:34.042282+00:00 app[web.1]: INFO:     46.31.39.131:0 - "GET /welcome HTTP/1.1" 200 OK
2020-04-26T21:18:45.284558+00:00 heroku[router]: at=info method=POST path="/patient" host=firsttime123.herokuapp.com request_id=1c678aeb-7f44-42c3-a614-eca76d931399 fwd="46.31.39.131" dyno=web.1 connect=0ms service=4ms status=302 bytes=153 protocol=https
2020-04-26T21:18:45.340633+00:00 heroku[router]: at=info method=GET path="/patient/2" host=firsttime123.herokuapp.com request_id=3481e5ed-ac15-4c61-b846-de03b05468ea fwd="46.31.39.131" dyno=web.1 connect=1ms service=5ms status=200 bytes=162 protocol=https
2020-04-26T21:18:45.283440+00:00 app[web.1]: INFO:     46.31.39.131:0 - "POST /patient HTTP/1.1" 302 Found
2020-04-26T21:18:45.339382+00:00 app[web.1]: INFO:     46.31.39.131:0 - "GET /patient/2 HTTP/1.1" 200 OK
2020-04-26T21:18:48.323093+00:00 app[web.1]: INFO:     46.31.39.131:0 - "POST /patient HTTP/1.1" 302 Found
2020-04-26T21:18:48.378126+00:00 app[web.1]: INFO:     46.31.39.131:0 - "GET /patient/3 HTTP/1.1" 200 OK
2020-04-26T21:18:48.379136+00:00 heroku[router]: at=info method=GET path="/patient/3" host=firsttime123.herokuapp.com request_id=85bd89f8-decb-43d5-ac7f-ef3546b8c8e0 fwd="46.31.39.131" dyno=web.1 connect=0ms service=2ms status=200 bytes=164 protocol=https
2020-04-26T21:18:48.324505+00:00 heroku[router]: at=info method=POST path="/patient" host=firsttime123.herokuapp.com request_id=f73e7577-f5ba-4a06-ba26-709aad130870 fwd="46.31.39.131" dyno=web.1 connect=0ms service=4ms status=302 bytes=153 protocol=https
2020-04-26T21:18:55.238996+00:00 app[web.1]: INFO:     46.31.39.131:0 - "GET /patient HTTP/1.1" 302 Found
2020-04-26T21:18:55.240079+00:00 heroku[router]: at=info method=GET path="/patient" host=firsttime123.herokuapp.com request_id=26e0a5e2-ca35-4043-bd5b-823d8cf4615c fwd="46.31.39.131" dyno=web.1 connect=0ms service=2ms status=302 bytes=261 protocol=https
2020-04-26T21:19:09.782440+00:00 app[web.1]: INFO:     46.31.39.131:0 - "DELETE /patient/1 HTTP/1.1" 302 Found
2020-04-26T21:19:09.783483+00:00 heroku[router]: at=info method=DELETE path="/patient/1" host=firsttime123.herokuapp.com request_id=fc9be986-da0c-4867-8c12-b15e4ee54d85 fwd="46.31.39.131" dyno=web.1 connect=1ms service=2ms status=302 bytes=131 protocol=https
2020-04-26T21:19:17.505410+00:00 app[web.1]: INFO:     46.31.39.131:0 - "GET /patient HTTP/1.1" 302 Found
2020-04-26T21:19:17.506544+00:00 heroku[router]: at=info method=GET path="/patient" host=firsttime123.herokuapp.com request_id=aceba448-4640-4053-8034-4a00ac1d53cb fwd="46.31.39.131" dyno=web.1 connect=0ms service=3ms status=302 bytes=215 protocol=https
Poriseler commented 4 years ago

W sumie nie wiem, czy taki był zamiar twórców zadania, ale ja po usunięciu elementu zwracam HTTP_204_NO_CONTENT (ty zdaje się 200). Trochę dziwny jest w tym kontekście błąd testów, który sugeruje użycie 3xx. W treści zadania nie było opisane co należy zwracać po usunięciu. Jednak na podstawie np. https://restfulapi.net/http-methods/

204 (No Content) if the action has been performed but the response does not include an entity. założyłem, że to dobre wyjście.

Nie chce mi się już sprawdzać dzisiaj, czy to jest u Ciebie problemem. Spróbuj zwracać NO CONTENT po usunięciu oraz w innych miejscach, w których jest to zasadne i daj znać, czy działa.

Bardzo możliwe w sumie, że to to w sumie, bo nic innego mi nie przychodzi do głowy niż błąd po stronie "sprawdzarki", za chwilkę sprawdzę - tak czy inaczej dzięki za pomoc :)

Poriseler commented 4 years ago

Niestety nie pomogło, więc temat cały czas aktywny

amakarewicz commented 4 years ago

U mnie jest to samo, mam ustawione w Procfile 1 worker i zwracam HTTP_204_NO_CONTENT ale i tak przechodzi nadal tylko 1 test na repl.it

Obsttube commented 4 years ago

@Poriseler dlaczego w @app.get("/patient") zwracasz 302?? przecież to powinno być 200! Natomiast gdy jest zerowa liczba pacjentów, ja zwracam 204, ale nie wiem, czy to jest wymagane. edit: w @app.delete("/patient/{id}") też zwracasz 302. ja zwracam 204 Generalnie nie za bardzo chce mi się debugować, może spróbuj sam przeklikać (w zasadzie powysyłać requesty) w przeglądarce? Mnie to pomogło wychwycić błędy.