Django 5 для начинающих

Прогресс по курсу:  9/1004

2.5 Диспетчер URL, часть 2.
3 из 13 шагов пройдено
0 из 42 баллов  получено

Параметры строки запроса

От параметров, которые передаются через адрес URL, следует отличать параметры, которые передаются через строку запроса. Например, в запросе:

http://127.0.0.1:8000/blog/3/Tom/

два последних сегмента 3/Tom/ представляют параметры URL или параметры маршрута. А в запросе:

http://127.0.0.1:8000/blog?id=3&name=Tom

те же самые значения 3 и Tom представляют параметры строки запроса.

Параметры строки запроса указываются после вопросительного знака ?.

Каждый параметр представляет пару ключ-значение, например, в id=3 : id - название или ключ параметра, а 3 - его значение.

Параметры в строке запроса отделяются друг от друга знаком амперсанда &.

request.GET - это словарь переменных "GET" запросов, сделанных на страницу, например в запросе типа: www.google.com/?django=4&python=3

request.GET будет содержать:{"django": 4, "python":3}

Поскольку request.GET является подобием словаря, он имеет метод .get(), который извлекает значение для ключа в словаре.

Например, изменим код в файле views.py, добавив следующие функции:

from django.http import HttpResponse


def index(request):
    return HttpResponse("<h2>Главная</h2>")


def user(request):
    age = request.GET.get("age")
    name = request.GET.get("name")
    return HttpResponse(f"<h2>Имя: {name}, Возраст: {age}</h2>")


Функция user принимает и извлекает из строки запроса два параметра: name и age. Для удобства работы давайте в главном файле маршрутов (urls.py) изменим код, убрав /blog/ из пути запроса.

from django.contrib import admin
from django.urls import path, include

urlpatterns = [
    path("admin/", admin.site.urls),
    path("", include("blog.urls")),
]


А теперь уже в файле urls.py нашего приложения blog определим следующие маршруты:

from django.urls import path
from blog import views

urlpatterns = [
    path("", views.index),
    path("user/", views.user)
]


При обращении к сайту по адресу http://127.0.0.1:8000/user/?name=Tom&age=22, параметр name будет иметь значение Tom, а параметр age - 22.


Однако возможна ситуация, когда для каких-то параметров не будет передано значение. В этом случае мы можем указать для подобных параметров значение по умолчанию. Для этого изменим определение функции user в views.py:

from django.http import HttpResponse


def index(request):
    return HttpResponse("<h2>Главная</h2>")


def user(request):
    age = request.GET.get("age", 0)
    name = request.GET.get("name", "Undefined")
    return HttpResponse(f"<h2>Имя: {name}, Возраст: {age}</h2>")

Второй параметр функции request.GET.get() представляет значение по умолчанию для параметра, для которого не задано значение.

Соответственно при обращении по адресу http://127.0.0.1:8000/user/ параметры name и age получат значения по умолчанию.


И также если один из параметров не будет передан, например при переходе по адресу http://127.0.0.1:8000/user/?age=32, то тоже будет использоваться значение по умолчанию:


Будьте вежливы и соблюдайте наши принципы сообщества. Пожалуйста, не оставляйте решения и подсказки в комментариях, для этого есть отдельный форум.
Оставить комментарий
Если использовать аннотацию типов, то какой тип ставить для request?

@Игорь_Галимов, тип WSGIRequest

Большое спасибо!