Как в Django настроить urls.py в случае с одинаковыми адресами запроса?

Мне надо сделать два запроса с помощью Django. К проекту подключена база данных с городами, улицами, и магазинами. Запросы следующие:

  • POST /shop/ - создание магазина
  • GET /shop/?street=&city=&open= - вывод данных

Мой код в urls.py

urlpatterns = [
    path('shop/', views.Getshop),
    path('shop/', views.Shopcreate),
]

Работа с строковым запросом и извлечением параметров идёт на ура, но выполняется только один запрос. Как отличить вышеуказанные два запроса друг от друга?

Вот мой код в views.py:

from django.shortcuts import render
from django.http import *
from .models import City
from .models import Street
from .models import Shop
import datetime
from django.utils import timezone

def Shopcreate(request):
    return HttpResponse("<h2>Shop create</h2>")

def Getshop(request):
    street = request.GET.get("street", -1)
    city = request.GET.get("city", -1)
    open = request.GET.get("open", -1)
    if open == "1":
        shops = Shop.objects.filter(shop_city_id=city, shop_street_id=street, shop_time_to_open__lte=timezone.now(),
                                    shop_time_to_close__gte=timezone.now())
    else:
        shops = Shop.objects.filter(shop_city_id=city, shop_street_id=street, shop_time_to_open__gt=timezone.now(),
                                    shop_time_to_close__gt=timezone.now())
    return render(request, "getshops.html", {"shops": shops})

Как правильно написать файл urls.py, чтобы запросы отличались между собой, будучи похожими по написанию?


Ответы (1 шт):

Автор решения: cauf

Поиск соответствия url-паттернов идет сверху вниз. То есть в вашем случае всегда будет срабатывать верхний паттер с вызовом views.Getshop.

В вашем случае не требуется создавать два разных url для работы с одним и тем же паттерном. Объедините оба обработчика в один, анализируя метод передачи параметров. например:

urlpatterns = [
    path('shop/', views.proc_shop),
]
def proc_shop(request):
    if request.method == 'POST':
        return HttpResponse("<h2>Shop create</h2>")
    elif request.method == 'GET':
        street = request.GET.get("street", -1)
        city = request.GET.get("city", -1)
        open = request.GET.get("open", -1)
        if open == "1":
            shops = Shop.objects.filter(shop_city_id=city, shop_street_id=street, shop_time_to_open__lte=timezone.now(),
                                        shop_time_to_close__gte=timezone.now())
        else:
            shops = Shop.objects.filter(shop_city_id=city, shop_street_id=street, shop_time_to_open__gt=timezone.now(),
                                        shop_time_to_close__gt=timezone.now())
        return render(request, "getshops.html", {"shops": shops})
→ Ссылка