如何从Django中的API返回数据?

时间:2016-08-12 14:06:09

标签: python json django api

我试图学习如何在Django中使用API​​,我想从html中的网页中返回一些简单数据。 API是Mozscape,当它在终端中运行时,可以获得100个网站的得分,如下所示:

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'就是我想要的一切。我希望用户在Django的页面中输入一个url并将该得分归结为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']

所以我有表格工作,当在html表格中输入一个网址时,它保存在管理员后端,但我现在不知道如何做的是如何将该网址传递到Mozscape API,以便我可以获得得分回来。

我看了一下Django休息框架并安装了它,并在Youtube和其他地方看了一些快速教程视频,但在这些例子中他们正在保存Django对象,如博客帖子,并将它们作为JSON数据返回,这不是什么我想做。

我尝试将API导入到视图文件中,然后将此行添加到视图

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

但是在网页

中输入网址后我收到此错误
<DomainAuthority: https://www.google.com> is not JSON serializable

我需要做什么才能将用户输入的网址传递给API并在网页中返回正确的回复?

感谢

编辑 - 截至8月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以获取分数并重定向到&#39; domain_authority_checked.html&#39;只有这个

{{ score }}

所以我在这里有两个结果,如果我传入&#39; client.urlMetrics&#39;作为回应我可以加载&#39; domain_authority.html&#39;但是在他输入表单之后,一个错误页面会返回

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

如果我没有通过&#39; client.urlMetrics&#39;为了回应,那么Django并不知道&#39; cols&#39;是,并返回此

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

2 个答案:

答案 0 :(得分: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']

答案 1 :(得分:1)

您可以使用:

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

而不是渲染表单。只需要在标题中导入json并创建一个名为&#34; data&#34;的空字典。