kleindan.dev

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:

  1. Edytora Visual Studio Code z wtyczką Remote-SSH
  2. Maszyny wirtualnej z zainstalowanym frameworkiem Django i przygotowaną startową aplikacją z poprzednich zajęć

Zacznij od zainstalowania Code i wtyczki Remote-SSH

VS Code z wtyczką 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.

Maszyna wirtualna

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

VS Code kod startowy

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:

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

  1. 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/”
  2. Używając przeglądarki upewnij się, że aplikacja zwraca spodziewany status HTTP 404 dla nieznanej nazwy ankiety.
  3. Zmodyfikuj implementacje widoków tak, aby widok index zwracał listę wszystkich ankiet wraz z ich krótkimi nazwami, a widok by_id zwracał w deterministyczny sposób jedną z ankiet
  4. Co się stanie, jeżel w pliku mysite/polls/views.py zamienimy kolejnością linie łączące ścieżki z widokami by_id i by_name?
  5. Spróbuj dodać kolejne elementy do już wypróbowanych ścieżek, jak aplikacja reaguje na te próby?
  6. 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 polecenia curl.
  7. Użyj debuggera, żeby podejrzeć zawartość zmiennej request, która trafia do funkcji widoków

VS Code debugowanie