Obsługa HTTP w Django: Ścieżki
W poprzedniej lekcji stworzyliśmy bardzo podstawową aplikację Django i nauczyliśmy się debugować ją przy pomocy Visual Studio Code. W tej lekcji nauczymy się jak możemy przekazywać parametry do naszego kodu aplikacji z używając zapytań HTTP.
Przygotowanie: Zdalne programowanie na maszynie wirtualnej
Aby wszyscy pracowali na jednorodnym środowisku programistycznym zaczniemy od przygotowania środowiska, które będzie składać się z:
- Edytora Visual Studio Code z wtyczką Remote-SSH
- Maszyny wirtualnej z zainstalowanym frameworkiem Django i przygotowaną startową aplikacją z poprzednich zajęć
Zacznij od zainstalowania Code i wtyczki Remote-SSH
Następnie używając Oracle VirtualBox zaimportuj dostarczoną maszynę wirtualną i uruchom ją.
Zaloguj się do uruchomionej maszyny wirtualnej używając loginu student i hasła changeme a następnie uruchom komendę ip a
aby zdobyć adres IP maszyny.
W Code użyj polecenia “Remote-SSH: Connect to Host…” i podaj adres IP, login i hasło, aby podłączyć się do maszyny wirtualnej. Po połączeniu powinna pojawić się znajoma aplikacja z samouczka tworzenia pierwszej aplikacji w django
Część praktyczna: ścieżki w URI
Na poprzedniej lekcji mówiliśmy o dokumentach Request For Comments (RFC), które standaryzują zasady działania różnych technologii internetowych. To co często nazywamy adresami internetowymi albo linkami, z techniczego punktu widzenia są to przykłady Uniform Resource Identifiers (URI), czyli jednorodnych identyfikatorów zasobów. Format URI definiowany jest przez RFC 3986. Poniższy rysunek pokazuje przykładowy adres z wyróżnieniem poszczególnych części URI:
W samouczku zaczęliśmy pracować nad aplikacją/modułem ankiet. Na razie nie będziemy jeszcze tworzyć bazy danych zawierającej poszczególne ankiety, ale załóżmy, że nasza aplikacja będzie trzymać w pamięci słownik z kilkoma pytaniami ankietowymi, a nasza aplikacja pozwoli nam dostać się do pytań ankietowych: wszystkich naraz, albo każdego z osobna.
Zacznijmy od zmiany pliku mysite/polls/views.py
i doprowadźmy go do takiej formy:
from django.shortcuts import render
from django.http import HttpResponse
open_polls = {
"pets": "Which are better, cats or dogs?",
"flavours": "Which is better? Chocolate or vanilla?",
"baby-boy-names": "What is the best name for a baby boy?",
}
def index(request):
return HttpResponse("Hello, you are in the polls page.")
def by_id(request, id):
return HttpResponse(f"This would be a page for a poll with ID {id}")
def by_name(request, poll_name):
global open_polls
if poll_name in open_polls:
return HttpResponse(open_polls[poll_name])
else:
return HttpResponse("No such poll right now", status=404)
Ten plik definiuje teraz 3 różne widoki dla naszego modułu polls
: index
, by_id
i by_name
. Django definiuje widok jako funkcję przyjmującą jako argumenty żądanie HTTP oraz dodatkowe argumenty zdefiniowane w ścieżce
Następnie, aby by móc się dostać do naszych widoków, musimy zmodyfikować nasz plik ze ścieżkami mysite/polls/urls.py
from django.urls import path
from . import views
urlpatterns = [
path("", views.index, name="index"),
path("<int:id>/", views.by_id, name="by_id"),
path("<str:poll_name>/", views.by_name, name="by_name"),
]
W ten sposób powiedzieliśmy naszej aplikacji, jakie widoki powinny obsługiwać jakie ścieżki w przypadku naszej aplikacji.
Zadania do części praktycznej
- Uruchom w debuggerze swoją aplikację i używając przeglądarki wejdź na następujące adresy:
- “http://127.0.0.1:8000/polls/”
- “http://127.0.0.1:8000/polls/123/”
- “http://127.0.0.1:8000/polls/pets/”
- “http://127.0.0.1:8000/polls/cars/”
- Używając przeglądarki upewnij się, że aplikacja zwraca spodziewany status HTTP 404 dla nieznanej nazwy ankiety.
- Zmodyfikuj implementacje widoków tak, aby widok
index
zwracał listę wszystkich ankiet wraz z ich krótkimi nazwami, a widokby_id
zwracał w deterministyczny sposób jedną z ankiet - Co się stanie, jeżel w pliku
mysite/polls/views.py
zamienimy kolejnością linie łączące ścieżki z widokamiby_id
iby_name
? - Spróbuj dodać kolejne elementy do już wypróbowanych ścieżek, jak aplikacja reaguje na te próby?
- Kiedy aplikacja działa w debuggerze, w dodatkowym terminalu w edytorze Code spróbuj użyć polecenia
curl <link>
aby otrzymać oczekiwane odpowiedzi na requesty HTTP. Żeby zobaczyć nieco więcej informacji, możesz użyć flagi-i
poleceniacurl
. - Użyj debuggera, żeby podejrzeć zawartość zmiennej
request
, która trafia do funkcji widoków