2016-08-12 4 views
1

Я пытаюсь узнать, как использовать API в Django, и я хочу вернуть некоторые простые данные из одного на веб-странице в html. API является Mozscape и при его запуске в терминале можно получить оценку веб-сайта из 100 так:Как вернуть данные из API в Django?

from mozscape import Mozscape 

client = Mozscape(
    'api_user_id', 
    'secret_key') 

url = 'http://www.google.com' 

get_da = client.urlMetrics(url, cols=68719476736) 

print(get_da) 

и это выводит следующее

{u'pda': 100} 

«100» все Я хочу туда. Я хочу, чтобы пользователю ввести URL в форму на странице в Django и получить этот счет Int назад, так что я сделал следующие модели, виды и формы

class DomainAuthority(models.Model): 
    url = models.URLField(max_length=300) 


    def __str__(self): 
     return self.url 

    class Meta: 
     verbose_name = 'Domain' 
     verbose_name_plural = 'Domains' 

views.py

def DomainAuthorityView(request): 


    form = DomainAuthorityForm(request.POST or None) 


    if form.is_valid(): 
     new_domain = form.save(commit=False) 
     new_domain.save() 


    return render(request, 'domain_authority.html', {'form': form}) 

forms.py

class DomainAuthorityForm(forms.ModelForm): 
    class Meta: 
     model = DomainAuthority 
     fields = ['url'] 

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

Я взглянул на инфраструктуру отдыха Django и установил ее, а затем выполнил несколько быстрых обучающих видеороликов на Youtube и других местах, но в этих примерах они берет сохраненные объекты Django, такие как сообщения в блогах, и возвращают их как данные JSON, которые не являются Что я хочу сделать.

Я пытался импортировать в API в файл просмотров, а затем добавить эту строку в то посмотреть

get_da = client.urlMetrics(new_domain, cols=68719476736) 

, но затем я получаю эту ошибку после ввода URL в форму на веб-странице

<DomainAuthority: https://www.google.com> is not JSON serializable 

Что мне нужно сделать, чтобы передать пользователю введенные URL-адреса API и вернуть правильный ответ на веб-странице?

благодаря

EDIT - ОБНОВЛЕНО VIEW от 19 августа

def DomainAuthorityView(request): 


    form = DomainAuthorityForm(request.POST or None) 


    if form.is_valid(): 
     new_domain = form.save(commit=False) 
     new_domain.save() 


     response = requests.get(new_domain.url, cols=68719476736) 
     #response = requests.get(client.urlMetrics(new_domain.url, cols=68719476736)) 
     json_response = response.json() 

     score = json_response['pda'] 

     return render(request, 'domain_authority_checked.html', {'score': score}) 

    else: 

    return render(request, 'domain_authority.html', {'form': form}) 

так что теперь он должен перенаправить после успешного завершения формы с URL и URL передается API, чтобы получить счет и переадресовывает к «domain_authority_checked.html» именно с этой

{{ score }} 

так у меня есть два результата здесь, если я перехожу в «client.urlMetrics» в ответ я могу загрузить «domain_auth ority.html», но после того, как URL-адрес его ввода в виде страница ошибки возвращается с этой

InvalidSchema at /domainauthority/ 
No connection adapters were found for '{'pda': 100}' 

если я не пройти„client.urlMetrics“в ответ, то Django не знает, что„перевалы“есть и возврат это

TypeError at /domainauthority/ 
request() got an unexpected keyword argument 'cols' 
+1

Причину ошибки заключается в том, что 'new_domain' является экземпляром' DomainAuthority', а не строкой, которая является функцией 'urlMetrics()'. Вместо этого вы должны называть его 'urlMetrics (new_domain.url)'. Теперь вы хотите сохранить результат вызова в своей базе данных или просто использовать его в представлении? – nephtes

+0

спасибо, я собираюсь попробовать ответ ниже, чтобы ответить на ваш вопрос Id, как бы попробовать оба на самом деле, чтобы сохранить счет в db, а также использовать его в представлении –

ответ

2

Я предлагаю этот подход:

import requests 

response = requests.get(url) 
json_response = response.json() 

score = json_response['key_name'] 

Вы можете просто вынести шаблон, добавить счет в контекст шаблона и отобразить значение с помощью {{}}.

Вы также можете определить rest_framework сериалайзер (в противном случае вам не нужно django_rest_framework) и проверить реакцию против этого сериализатором для того, чтобы убедиться, что вы получили то, что вы ожидали:

serializer = MySerializer(data=json_response) 
    if serializer.is_valid(): 
     score = json_response['key_name'] 
+0

нормально, можете уточните, что «key_name» должно быть, пожалуйста, как Im не понятно, спасибо –

+1

Обычно API возвращает данные, обработанные json. Например. {'key_name', 'value'}. Вы должны проверить возврат api, который вы запрашиваете, используя curl, например, и установите для него значение key_name (действительно, api часто возвращает несколько полей) –

+0

ОК, я думаю, что я пойду так, пойду, спасибо –

1

Вы можете использовать:

return HttpResponse(json.dumps(data), content_type='application/json') 

вместо визуализации формы.Только вам нужно импортировать json в заголовок и создать пустой dict с именем «data».

+0

OK спасибо, я попробую, что –

Смежные вопросы