Python 如何在Django中从API返回数据?
我试图学习如何在Django中使用API,我想用html从网页中返回一些简单的数据。API是Mozscape,在终端上运行时,可以获得网站的100分,如下所示: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)
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
aDomainAuthority
实例,而不是urlMetrics()
函数所期望的字符串。您应该将其称为urlMetrics(new\u domain.url)
。现在,您想将调用结果存储在数据库中,还是仅在视图中使用?谢谢,我将尝试下面的答案,为了回答您的问题,我想尝试两种方法,以便将分数保存到数据库并在视图中使用。错误原因是new_domain
aDomainAuthority
实例,不是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})