Size: a a a

Django [ru] #STAY HOME

2019 November 06

YK

Yegor Kowalew in Django [ru] #STAY HOME
Адилет Асанкожоев
В АПИ? В каком смысле?
почему оно сюда не попало?
источник

PZ

Pavel Zagrebelin in Django [ru] #STAY HOME
Yegor Kowalew
почему оно сюда не попало?
разберись, как работает urlpatterns и include. Это реально несложно.
источник

YK

Yegor Kowalew in Django [ru] #STAY HOME
Pavel Zagrebelin
разберись, как работает urlpatterns и include. Это реально несложно.
как это работает в стандартной джанге, я понимаю. Но у реста оно ведь типа свое получается
источник

PZ

Pavel Zagrebelin in Django [ru] #STAY HOME
Yegor Kowalew
как это работает в стандартной джанге, я понимаю. Но у реста оно ведь типа свое получается
Нет. DRF - это просто обёртка над джанго-вьюшками
источник

АА

Адилет Асанкожоев in Django [ru] #STAY HOME
Оно точно такое же
источник

YK

Yegor Kowalew in Django [ru] #STAY HOME
Сейчас почитаю как в ресте с урлами работают
источник

PZ

Pavel Zagrebelin in Django [ru] #STAY HOME
Yegor Kowalew
Сейчас почитаю как в ресте с урлами работают
точно также, как и в джанге. :)
источник

YK

Yegor Kowalew in Django [ru] #STAY HOME
Pavel Zagrebelin
точно также, как и в джанге. :)
да нет жи!
источник

YK

Yegor Kowalew in Django [ru] #STAY HOME
Pavel Zagrebelin
точно также, как и в джанге. :)
От куда тогда это взялось?
from rest_framework import routers
router = routers.DefaultRouter()
router.register(r'history', views.HistoryViewSet)
источник

YK

Yegor Kowalew in Django [ru] #STAY HOME
Есть роутер у джанги и есть отдельный роутер у реста
источник

PZ

Pavel Zagrebelin in Django [ru] #STAY HOME
Yegor Kowalew
От куда тогда это взялось?
from rest_framework import routers
router = routers.DefaultRouter()
router.register(r'history', views.HistoryViewSet)
просто обёртка, которая из одного ViewSet делает до 3-4 записей path()
источник

YK

Yegor Kowalew in Django [ru] #STAY HOME
и на сколько я понимаю в мое /api/ попадет только то что я запихал в роутер реста
источник

PZ

Pavel Zagrebelin in Django [ru] #STAY HOME
Yegor Kowalew
Есть роутер у джанги и есть отдельный роутер у реста
посмотри ниже, там наверняка есть строка типа urlpatterns = router.urls + []
источник

YK

Yegor Kowalew in Django [ru] #STAY HOME
Pavel Zagrebelin
просто обёртка, которая из одного ViewSet делает до 3-4 записей path()
Почему тогда сюда не попали все джанговские урлы?
источник

YK

Yegor Kowalew in Django [ru] #STAY HOME
потому что путь /api/ ... сейчас блин перековыряю все
источник

YK

Yegor Kowalew in Django [ru] #STAY HOME
по хорошему, все-таки нужно создать отдельно api.urls.py и urls.py
источник

PZ

Pavel Zagrebelin in Django [ru] #STAY HOME
Yegor Kowalew
по хорошему, все-таки нужно создать отдельно api.urls.py и urls.py
покажи urls, где у тебя /api/ определяется
источник

YK

Yegor Kowalew in Django [ru] #STAY HOME
Pavel Zagrebelin
покажи urls, где у тебя /api/ определяется
в корневом урлс проекта https://dpaste.de/hcSd
источник

PZ

Pavel Zagrebelin in Django [ru] #STAY HOME
Yegor Kowalew
Почему тогда сюда не попали все джанговские урлы?
DefaultRouter регистрирует, в том числе, и вьюшку, в которой перечисляет те роуты, которые зарегистрированы в нём. Урл этой вьюшки - ''.
Это поведение решается полем include_root_view, которое можно выключить.
router= DefaultRouter()
router.register(....)
router.include_root_view = False
Вся эта магия происходит вот тут:
https://github.com/encode/django-rest-framework/blob/master/rest_framework/routers.py#L341
https://github.com/encode/django-rest-framework/blob/master/rest_framework/routers.py#L352

а как добавился в urls DefaultRouter? Да вот же:
https://dpaste.de/hcSd#L22
https://dpaste.de/Rn7F#L12
ты регистриуешь prefix /api/, в котором надо пройти в три инклюда.
Я не знаю, что в user_profile.urls и в history.urls, но скорее всего там нет строк path('') с пустым путём.

То есть, в джангу приходит запрос /api/. Она выбирает три инклюда, убирает префикс api/ , и пытается в каждый инклюд применить пустую строку. Пустая строка подохит вот сюда:    path('', include(router.urls)), а в router.urls пустая строка - это вот эта картинка на скриншоте.

Смотри, в моём сообщении почти что нет DRF, голая джанга.

Разберись как работают urlpatterns, path и инклюды, тебе гораздо лечге жить станет.
источник

YK

Yegor Kowalew in Django [ru] #STAY HOME
Pavel Zagrebelin
DefaultRouter регистрирует, в том числе, и вьюшку, в которой перечисляет те роуты, которые зарегистрированы в нём. Урл этой вьюшки - ''.
Это поведение решается полем include_root_view, которое можно выключить.
router= DefaultRouter()
router.register(....)
router.include_root_view = False
Вся эта магия происходит вот тут:
https://github.com/encode/django-rest-framework/blob/master/rest_framework/routers.py#L341
https://github.com/encode/django-rest-framework/blob/master/rest_framework/routers.py#L352

а как добавился в urls DefaultRouter? Да вот же:
https://dpaste.de/hcSd#L22
https://dpaste.de/Rn7F#L12
ты регистриуешь prefix /api/, в котором надо пройти в три инклюда.
Я не знаю, что в user_profile.urls и в history.urls, но скорее всего там нет строк path('') с пустым путём.

То есть, в джангу приходит запрос /api/. Она выбирает три инклюда, убирает префикс api/ , и пытается в каждый инклюд применить пустую строку. Пустая строка подохит вот сюда:    path('', include(router.urls)), а в router.urls пустая строка - это вот эта картинка на скриншоте.

Смотри, в моём сообщении почти что нет DRF, голая джанга.

Разберись как работают urlpatterns, path и инклюды, тебе гораздо лечге жить станет.
Спасибо за лекцию. Пойду наводить порядки в урлах
источник