【问题标题】:Goodreads API and DjangoGoodreads API 和 Django
【发布时间】:2018-01-03 10:52:09
【问题描述】:

我正在尝试在 Django 项目中使用 Goodreads API。我已经设置了一个简单的标签来提取 reviews_widget 并试图将 css 样式和 html 发送到模板。但是,样式和 html 在发送时没有被注册。使用 {{reviews_widget}} 将样式和 html 显示为字符串,但 {% load reviews_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 %}

views.py

from django.shortcuts import render
from givegetapp.models import Give, Get, Reader

# 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

def book():


    isbn = '0990355454'

    key = 'devKEY' #replaced w/ dev 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)

    return render(request, "book.html", {"reviews_widget": reviews_widget})

模板标签/reviews_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}

由于样式需要位于头部,我想我必须将响应拆分为不同的变量。我该怎么做呢?另外,模板如何将响应视为 html 而不是字符串?

【问题讨论】:

    标签: python html css django api


    【解决方案1】:

    拆分 你可以这样做:

    first_part = response_html.split("</style>")[0] + "</style>"
    second_part = response_html.split("</style>")[1]
    

    然后将 first_part 和 second_part 都用作模板上下文变量

    return render(request, "book.html", {
        "style_section": first_part,
        "content_section": second_part,
        "reviews_widget": reviews_widget,
    })
    

    呈现为 HTML 而不是字符串 您可以使用 mark_safe 让它在模板中显示为呈现的 HTML。仔细考虑您是否能够执行此操作,因为如果您不信任数据源,这可能会带来安全风险(GoodReads 是一个非常安全的选择,但它值得考虑,具体取决于您的应用程序需要的防水程度)

    <html>
        <head>
            {{ style_section|safe }}
        </head>
        <body>
            {{ content_section|safe }}
        </body>
    </html>
    

    【讨论】:

    • 好东西。谢谢你。只是为了澄清,一个 simple_tag 是不必要的。我可以在 views.py 中设置变量并发送到模板。
    • 是的!如果您想使用模板标签格式化数据,也可以这样做。但是,如果您的视图完全按照您希望在模板中使用它来拆分响应 HTML,则您不需要:只需添加 |safe 过滤器,它就会按照您的预期呈现。跨度>
    猜你喜欢
    • 2018-12-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-11-11
    • 1970-01-01
    • 2019-02-03
    • 2012-05-11
    • 1970-01-01
    相关资源
    最近更新 更多