Передать URL в качестве параметра в Django Urls - PullRequest
0 голосов
/ 05 сентября 2018

Я работаю над проектом Django (2), в котором мне нужно передать URL в качестве параметра в URL Django, Вот что я попробовал:

urls.py:

urlpatterns = [
path('admin/', admin.site.urls),
url(r'^api/(?P<address>.*)/$', PerformImgSegmentation.as_view()),
]

views.py:

class PerformImgSegmentation(generics.ListAPIView):
    def get(self, request, *args, **kwargs):
        img_url = self.kwargs.get('address')
        print(img_url)
        print('get request')
    return 'Done'

Но это не работает, я передал аргумент с именем address через почтальона, но это не удалось. Возвращает эту ошибку:

Не найдено: / api / [05 / Sep / 2018 15:28:06] «GET / api / HTTP / 1.1» 404 2085

Ответы [ 3 ]

0 голосов
/ 06 сентября 2018

Django 2.0 предоставляет Path Converters для преобразования параметров пути в соответствующие типы, который также включает конвертер для urls, взгляните на документы .

Итак, ваши URL могут быть такими:

path('api/<path:encoded_url>/', PerformImgSegmentation.as_view()),

Итак, преобразователь path будет сопоставлять любую непустую строку, включая разделитель пути, '/'. Это позволяет сопоставлять полный путь URL-адреса, а не только сегмент пути URL-адреса, как в случае str.

Тогда в представлении мы можем просто получить наши URL значения из kwargs следующим образом:

img_url = self.kwargs.get('encoded_url')
print(img_url)
0 голосов
/ 27 ноября 2018

Вы пытаетесь передать URL https://i.imgur.com/TGJHFe1.jpg в качестве параметра из шаблона django в представление?

Вы можете просто написать в своем приложении url.py:

path(api/<path:the_url_you_want_to_pass>', PerformImgSegmentation.as_view())

Пожалуйста, ознакомьтесь с этой статьей .

0 голосов
/ 05 сентября 2018

Django 2.0 и более поздние версии теперь используют конструкторы path func для указания URL-адресов. Я не уверен, есть ли обратная совместимость; Вы можете попробовать это на простом примере. Однако, если вы начинаете писать приложение, вы должны использовать path:

path('api/<str:encoded_url>/', view_action)

Во избежание путаницы со стандартным путем просмотра в вашем приложении я не рекомендую использовать конвертер path вместо str (первый позволяет сопоставить /, а другой - нет).

Вы можете получить дополнительную помощь по переходу с url на path с этой статьей .

Второй шаг, получить encoded_url в качестве аргумента в представлении. Вам необходимо расшифровать его : чтобы передать URL-адрес внутри полученного URL-адреса, вы используете кодировку ASCII, которая заменяет некоторые зарезервированные символы другими (например, косой чертой).

Вы можете легко кодировать и декодировать URL с помощью urllib (есть и другие модули). Для Python 3.7 синтаксис выглядит следующим образом (документы здесь)

>>> urllib.parse.quote("http://www.google.com")
'http%3A//www.google.com'
>>> urllib.parse.unquote('http%3A//www.google.com')
'http://www.google.com'

Помните: если вы передадите URL без кавычек, он не будет совпадать: вы не принимаете совпадения для слэшей с этим выражением пути. (Редактировать: метод цитаты по умолчанию не преобразует косую черту, для этого вам нужно передать: quote(<str>, safe='')

Так, например, ваш вызов GET должен выглядеть так: /api/http%3A%2F%2Fwww.google.com. Однако лучше, если вы передадите URL-адрес в качестве параметра get и в путях, которые вам важны, только читабельность (например, /api/name_to_my_method?url=http%3A%2F%2Fwww.google.com). Разработка пути важна для читабельности, и прохождение цитируемого URL обычно не является практикой (хотя вполне возможно).

...