DRF: как отобразить относительные URL-адреса в виде гиперссылок в просматриваемом API?

#django #django-rest-framework

#django #django-rest-framework

Вопрос:

Я предоставляю свой api через шлюз api. Итак, абсолютные URL-адреса — это проблема, я должен использовать относительные URL-адреса.

Поэтому при создании URL-адреса я не отправляю запрос. Это создает относительные URL-адреса.

 @api_view(['GET'])
def api_root(request, format=None):
    return Response({
        'users': reverse('user-list', request=None, format=format),
        'snippets': reverse('snippet-list', request=None, format=format)
    })
  

При использовании этого метода в интерфейсном интерфейсе browsable API URL-адреса не отображаются в виде гиперссылок. Я хочу разрешить пользователю переходить по относительным URL-адресам вместо того, чтобы копировать ссылку и добавлять ее в строку URL-адреса браузера.

Есть ли способ сделать это с помощью Django Rest Framework? Я знаю, что rest api для AWX делает это каким-то образом.

Комментарии:

1. Как насчет этого, API-интерфейсов с отношениями и гиперссылками

2. Надеюсь, это тоже полезно, HyperlinkedModelSerializer

3. Спасибо @ArakkalAbu, я обновил свой вопрос со ссылкой на ваши ссылки.

Ответ №1:

После изучения того, что делал awx, они используют Javascript или jQuery для преобразования относительных URL-адресов.

Согласно api.js

 // Make links from relative URLs to resources.
$('span.str').each(function() {
  var s = $(this).html();
  if (s.match(/^"/. /"$/) || s.match(/^"/. /?.*"$/)) {
    $(this).html('"<a href='   s   '>'   s.replace(/"/g, '')   '</a>"');
  }
});
  

Поэтому включил это в templates/rest_framework/api.html :

 {% block script %}
<script>
  window.drf = {
    csrfHeaderName: "{{ csrf_header_name|default:'X-CSRFToken' }}",
    csrfToken: "{% if request %}{{ csrf_token }}{% endif %}"
  };
</script>
<script src="{% static "rest_framework/js/jquery-3.4.1.min.js" %}"></script>
<script src="{% static "rest_framework/js/ajax-form.js" %}"></script>
<script src="{% static "rest_framework/js/csrf.js" %}"></script>
<script src="{% static "rest_framework/js/bootstrap.min.js" %}"></script>
<script src="{% static "rest_framework/js/prettify-min.js" %}"></script>
<script src="{% static "rest_framework/js/default.js" %}"></script>

<script src="{% static "js/api.js" %}"></script>

<script>
  $(document).ready(function() {
    $('form').ajaxForm();
  });
</script>
{% endblock %}
  

Комментарии:

1. ИМХО, вам не нужно играть с js