我试图学习如何在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'
答案 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;的空字典。