Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/360.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如何在Django中从API返回数据?_Python_Json_Django_Api - Fatal编程技术网

Python 如何在Django中从API返回数据?

Python 如何在Django中从API返回数据?,python,json,django,api,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)

我试图学习如何在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表单中输入url时,它会保存在管理后端,但我现在不知道如何将该url传递到Mozscape API中,以便我可以获得分数

我查看了Django rest框架,安装了它,并在Youtube和其他地方观看了一些快速教程视频,但在这些示例中,他们获取了保存的Django对象,如博客文章,并将其作为JSON数据返回,这不是我想要做的

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

get_da = client.urlMetrics(new_domain, cols=68719476736)
但是,在网页的表单中输入url后,我出现了这个错误

<DomainAuthority: https://www.google.com> is not JSON serializable
因此,现在它应该在成功完成表单后使用url重定向,url被传递到API以获得分数,并重定向到“domain\u authority\u checked.html”,只需这样做

{{ score }}
因此,这里有两个结果,如果我将“client.urlMetrics”传入响应,我可以加载“domain\u authority.html”,但在url输入表单后,会返回一个错误页面

InvalidSchema at /domainauthority/
No connection adapters were found for '{'pda': 100}'
如果我没有将“client.urlMetrics”传递给响应,那么Django不知道“cols”是什么,并返回这个

TypeError at /domainauthority/
request() got an unexpected keyword argument 'cols'
您可以使用:

return HttpResponse(json.dumps(data), content_type='application/json')
而不是渲染窗体。只需在标头中导入json并创建名为“data”的空dict即可。

您可以使用:

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

而不是渲染窗体。只需在标题中导入json并创建一个名为“data”的空dict即可。

我建议采用这种方法:

import requests

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

score = json_response['key_name']
然后,您可以简单地呈现一个模板,将分数添加到模板上下文中,并使用{{}显示值

您可能还希望定义一个rest_框架序列化程序(否则您不需要django_rest_框架),并验证对此序列化程序的响应,以确保收到预期的结果:

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

我建议采取这种做法:

import requests

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

score = json_response['key_name']
然后,您可以简单地呈现一个模板,将分数添加到模板上下文中,并使用{{}显示值

您可能还希望定义一个rest_框架序列化程序(否则您不需要django_rest_框架),并验证对此序列化程序的响应,以确保收到预期的结果:

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

错误的原因是
new\u domain
a
DomainAuthority
实例,而不是
urlMetrics()
函数所期望的字符串。您应该将其称为
urlMetrics(new\u domain.url)
。现在,您想将调用结果存储在数据库中,还是仅在视图中使用?谢谢,我将尝试下面的答案,为了回答您的问题,我想尝试两种方法,以便将分数保存到数据库并在视图中使用。错误原因是
new_domain
a
DomainAuthority
实例,不是
urlMetrics()
函数所期望的字符串。您应该将其称为
urlMetrics(new\u domain.url)
。现在,您想将通话结果存储在数据库中,还是仅在视图中使用?谢谢,我将尝试下面的答案,为了回答您的问题,我真的想尝试两种方法,因此为了将分数保存到db并在视图中使用它好的,请您澄清一下“key_name”应该是什么,因为我不清楚,谢谢,API返回json解析的数据。例如,{'key_name','value'}。您必须检查您正在查询的api的返回,例如使用curl,并相应地设置key_名称(实际上api经常返回多个字段)不,仍然是v.tbh,不确定我在这里做什么,您能看到我上面编辑的代码吗?我真的不确定我是否用正确的方法来做这件事,“pda”是API中得分的关键(我想)。我看到了一个副本,上面有你编辑视图的第6行和第7行。这两个都做同样的事情:查询api。您应该去掉第6行(从get_da开始),并将cols参数添加到下面的行中。此外,您需要将score变量添加到上下文中,方法与表单相同,否则无法使用templatetag{{}在模板中显示它。下面是您的呈现的外观:return render(请求,'domain_authority.html',{form','score':score})ok,请你澄清一下“key_name”应该是什么,因为我不清楚,谢谢,API返回的是json解析的数据。例如,{'key_name','value'}。您必须检查您正在查询的api的返回,例如使用curl,并相应地设置key_名称(实际上api经常返回多个字段)不,仍然是v.tbh,不确定我在这里做什么,您能看到我上面编辑的代码吗?我真的不确定我是否用正确的方法来做这件事,“pda”是API中得分的关键(我想)。我看到了一个副本,上面有你编辑视图的第6行和第7行。这两个都做同样的事情:查询api。您应该去掉第6行(从get_da开始),并将cols参数添加到下面的行中。此外,您需要将score变量添加到上下文中,方法与表单相同,否则无法使用templatetag{{}在模板中显示它。下面是您的呈现应该是什么样子:return render(请求,'domain_authority.html',{form':form,'score':score})