Подтвердить что ты не робот

Правильный способ использования данных RESTFUL API в django

Я пытаюсь изучить django, поэтому пока у меня есть текущее решение, я не уверен, следует ли ему следовать лучшим практикам в django. Я хотел бы отображать информацию из веб-api на моем веб-сайте. Скажем, api url выглядит следующим образом:

http://api.example.com/books?author=edwards&year=2009

Thsis вернет список книг Эдвардса, написанных в 2009 году. Вернулся в следующем формате:

{'results':
             [
                {
                   'title':'Book 1',
                   'Author':'Edwards Man',
                   'Year':2009
                },
                {
                   'title':'Book 2',
                   'Author':'Edwards Man',
                   'Year':2009}
           ]
}

В настоящее время я использую API в моем файле представлений следующим образом:

class BooksPage(generic.TemplateView):
    def get(self,request):
        r = requests.get('http://api.example.com/books?author=edwards&year=2009')
        books = r.json()
        books_list = {'books':books['results']}
        return render(request,'books.html',books_list)

Обычно мы извлекаем данные из базы данных в файле models.py, но я не уверен, следует ли мне захватывать эти данные API в models.py или views.py. Если это должно быть в models.py, может ли кто-нибудь привести пример того, как это сделать? Я написал вышеприведенный пример для stackoverflow, поэтому любые ошибки являются результатом записи здесь.

4b9b3361

Ответ 1

Мне нравится подход такой логики в отдельный уровень сервиса (services.py); данные, которые вы просматриваете, не являются "моделью" в смысле Django ORM, и это более чем простая логика "представления". Чистая инкапсуляция гарантирует, что вы можете делать такие вещи, как управление интерфейсом для службы поддержки (т.е. Сделать его похожим на API Python и URL с параметрами), добавить такие улучшения, как кеширование, как упомянуто @sobolevn, протестировать API в изоляции, и др.

Итак, я бы предложил простой services.py, который выглядит примерно так:

def get_books(year, author):
    url = 'http://api.example.com/books' 
    params = {'year': year, 'author': author}
    r = requests.get(url, params=params)
    books = r.json()
    books_list = {'books':books['results']}
    return books_list

Обратите внимание, как передаются параметры (используя возможность пакета requests).

Затем в views.py:

import services
class BooksPage(generic.TemplateView):
    def get(self,request):
        books_list = services.get_books('2009', 'edwards')
        return render(request,'books.html',books_list)

См. также:

Ответ 2

Используйте сериализатор вместо .json, так как он дает гибкость для возврата в нескольких форматах. Поскольку при использовании rest-api предпочтительным является использование предоставленного сериализатора.

Также сохраняйте обработку данных и получайте запросы данных в view.py. Формы используются для шаблонов не как бизнес-логика.

Ответ 3

Ну, есть несколько вещей, которые нужно иметь в виду. Прежде всего, в этом случае ваши данные не так часто меняются. Поэтому рекомендуется кэшировать такие ответы. Существует много инструментов кеширования, но redis является популярным вариантом. Альтернативно, вы можете выбрать дополнительную базу данных NoSQL для кеширования.

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

И учитывая место, где вы должны позвонить API-запрос, я бы сказал, что он сильно зависит от второго вопроса. Возможные варианты:

  • views.py только для отображения данных.
  • forms.py или еще views.py для неактивности.

Ответ 4

 <tbody>
                {% if libros %}
                {% for libro in libros %}
                <tr>
                    <td>{{ libro.id }}</td>
                    <td>{{ libro.titulo }}</td>
                    <td>{{ libro.autor }}</td>
                    <td>{{ libro.eiditorial }}</td>
                    <td>{{ libro.descripcion }}</td>
                    <td>{{ libro.cantidad }}</td>
                    <td>{{ libro.Bodega.nombre }}</td>
                    <td>
                        {% if libro.imagen %}
                    <td><img src= "{{ libro.imagen.url }} "align="center" width="50px" ></td>
                    {% else %}
                    <h6>no hay imagen de libros</h6>
                    {% endif %}
                    </td>
                    <td><a class ="btn btn-primary "href="/">Editar</a></td>
                    <td><a class ="btn btn-danger red"href="/">Eliminar</a></td>
                </tr>
                {% endfor %}
                {% else %}
                <h1>no hay registros de libros</h1>
                {% endif%}
            </tbody>

как я могу назвать это в HTML, когда у меня уже есть список приветствий моего локального приложения