Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/html/87.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 Goodreads API和Django_Python_Html_Css_Django_Api - Fatal编程技术网

Python Goodreads API和Django

Python Goodreads API和Django,python,html,css,django,api,Python,Html,Css,Django,Api,我试图在Django项目中使用。我已经设置了一个简单的标签来提取reviews_小部件,并试图将css样式和html发送到模板。但是,发送时未注册样式和html。使用{{reviews\u widget}}将样式和html显示为字符串,但{%load reviews\u widget%}不显示任何内容 book.html {% extends "base.html"%} {% block content %} <!-- Does not render --> {% loa

我试图在Django项目中使用。我已经设置了一个简单的标签来提取reviews_小部件,并试图将css样式和html发送到模板。但是,发送时未注册样式和html。使用{{reviews\u widget}}将样式和html显示为字符串,但{%load reviews\u widget%}不显示任何内容

book.html

{% extends "base.html"%}


{% block content %}

<!--  Does not render -->
  {% load reviews_widget %}

<!--  Shows response in string format -->
  {{ reviews_widget }}

 <!--  What is sent to template-->
<!--
<style> #goodreads-widget { font-family: georgia, serif; padding: 18px 0; width:565px; }
#goodreads-widget h1 { font-weight:normal; font-size: 16px; border-bottom: 1px solid #BBB596;
margin-bottom: 0; } #goodreads-widget a { text-decoration: none; color:#660; }
iframe{ background-color: #fff; } #goodreads-widget a:hover { text-decoration: underline; }
#goodreads-widget a:active { color:#660; } #gr_footer { width: 100%; border-top: 1px solid #BBB596;
text-align: right; } #goodreads-widget .gr_branding{ color: #382110; font-size: 11px;
text-decoration: none; font-family: "Helvetica Neue", Helvetica, Arial, sans-serif; } </style>
<div id="goodreads-widget"> <div id="gr_header"><h1><a href="https://www.goodreads.com/book/show/31430654-the-millionaire-booklet">
The Millionaire Booklet Reviews</a></h1></div> <iframe id="the_iframe"
src="https://www.goodreads.com/api/reviews_widget_iframe?did=DEVELOPER_ID&amp;format=html&amp;isbn=0990355454&amp;links=660&amp;min_rating=&amp;review_back=fff&amp;stars=000&amp;text=000"
width="565" height="400" frameborder="0"></iframe> <div id="gr_footer"> <a class="gr_branding"
target="_blank" href="https://www.goodreads.com/book/show/31430654-the-millionaire-booklet?utm_medium=api&amp;utm_source=reviews_widget">
Reviews from Goodreads.com</a> </div> </div>
-->

{% endblock %}
templatetags/reviews\u widget.py

from django import template

# For GoodReads Api
from django.http import HttpResponse
from django.template import Context, loader
from django.http import HttpRequest
import xml.etree.ElementTree as ET
import sys
import requests

from django import template
register = template.Library()


try:
    import urllib.request as urllib2
except ImportError:
    import urllib2
# end of GoodReads


register = template.Library()

@register.simple_tag()
def reviews_widget():
    isbn = '0990355454'

    key = 'g6mDefuBPg0ajE7c4Nwyg' #replace it with your developer key

    response = requests.get('https://www.goodreads.com/book/isbn/'+isbn+'?key='+key)

    tree = ET.fromstring(response.content)

    reviews_widget = str

    for leaves in tree[1]:

        if leaves.tag == "reviews_widget":
            # print(str(leaves.text))
            reviews_widget = str(leaves.text)
    # print(reviews_widget)
    return {'reviews_widget': reviews_widget}
因为样式需要在head部分,所以我想我必须将响应分成不同的变量。我该怎么做呢?此外,模板如何将响应视为html而不是字符串?

拆分 您可以这样做:

first_part = response_html.split("</style>")[0] + "</style>"
second_part = response_html.split("</style>")[1]
呈现为HTML而不是字符串 您可以使用mark_safe将其显示为模板中呈现的HTML。仔细想想,如果你能做到这一点,因为它可能是一个安全风险,如果你不相信数据源(GooRead是一个相当安全的赌注,但它值得考虑取决于你的应用程序需要防水)< /P>

{{style_section}安全}
{{content_section|safe}}

好东西。非常感谢。只是澄清一下,一个简单的_标签是不必要的。我可以在views.py中设置变量并发送到templates.Yepp!如果希望使用模板标记格式化数据,也可以这样做。但是,如果您的视图完全按照您希望在模板中使用的方式拆分响应HTML,则无需这样做:只需添加| safe过滤器,它就会按照您的预期呈现。
first_part = response_html.split("</style>")[0] + "</style>"
second_part = response_html.split("</style>")[1]
return render(request, "book.html", {
    "style_section": first_part,
    "content_section": second_part,
    "reviews_widget": reviews_widget,
})
<html>
    <head>
        {{ style_section|safe }}
    </head>
    <body>
        {{ content_section|safe }}
    </body>
</html>