在Heroku中,一些链接标记显示为原始HTML代码

时间:2016-03-03 11:24:10

标签: python html django heroku

我将Django项目设为在线后,我的部分HTML代码无法正常运行。相反,它们会在页面上显示为原始HTML代码。但是,当我在localhost(而不是Heroku)上运行网站时,这个问题就不会发生了。链接将按原样显示。

我将Python 3.4Django 1.9一起使用,托管网站是Heroku。这是问题的图像: enter image description here

我使用'检查'检查了原始HTML代码的来源。 Chrome中的工具,发现了这个: enter image description here

我遇到问题的应用是llazzaro的调度程序(在GitHub上),所有模板都可以在那里找到。第一张图片中指示的模板具有以下代码:

{% extends "base.html" %}
{% load scheduletags i18n %}
{% block body %}
<div class="tablewrapper">
  <div class="calendarname">{{ calendar.name }}</div>
  {% prevnext "tri_month_calendar" calendar periods.month "F Y"%}
  <div class="now">
    <a href="{% url "tri_month_calendar" calendar.slug %}">
      {% trans "This month" %}
    </a>
  </div>
<table align="center">
    <tr>
        <td valign="top">{% month_table calendar periods.month "small" -1 %}</td>
        <td width="12">&nbsp;</td>
        <td valign="top">{% month_table calendar periods.month "small" %}</td>
        <td width="12">&nbsp;</td>
        <td valign="top">{% month_table calendar periods.month "small" +1 %}</td>
    </tr>
</table>
</div>
<div class="navigation">
  <a href="{% url "month_calendar" calendar.slug %}{% querystring_for_date periods.month.start 2 True %}">
    {% trans "Monthly Calendar" %}
  </a>
  <a href="{% url "year_calendar" calendar.slug %}{% querystring_for_date periods.month.start 1 True %}">
    {% trans "Full Year Calendar" %}
  </a>
</div>
{% endblock %}

有人可以提供一些帮助或建议吗?感谢。

编辑#1 :我做了一些调查,并认为在上面的代码中,这两行是导致问题的最可能原因:

  <div class="calendarname">{{ calendar.name }}</div>
  {% prevnext "tri_month_calendar" calendar periods.month "F Y"%}

对于第二行代码,我找到了&#39; prevnext&#39;作为模板标记,代码为:

@register.inclusion_tag("schedule/_prevnext.html")
def prevnext(target, calendar, period, fmt=None):
    if fmt is None:
        fmt = settings.DATE_FORMAT
    context = {
        'calendar': calendar,
        'period': period,
        'period_name': format(period.start, fmt),
        'target': target,
    }
    return context

然后我找到了&#39; _prevnext.html&#39;,以下是其内容:

{% load scheduletags staticfiles %}
<div class="row row-centered">
    {% prev_url target calendar period %}
    &nbsp; <b>{{period_name}}</b> &nbsp;
    {% next_url target calendar period %}
</div>

&#39; prev_url&#39;和&#39; next_url&#39;如下:

@register.simple_tag
def prev_url(target, calendar, period):
    now = timezone.now()
    delta = now - period.prev().start
    slug = calendar.slug
    if delta.total_seconds() > SCHEDULER_PREVNEXT_LIMIT_SECONDS:
        return ''

    return '<a href="%s%s"><span class="glyphicon glyphicon-circle-arrow-left"></span></a>' % (
        reverse(target, kwargs=dict(calendar_slug=slug)),
        querystring_for_date(period.prev().start, autoescape=True))


@register.simple_tag
def next_url(target, calendar, period):
    now = timezone.now()
    slug = calendar.slug

    delta = period.next().start - now
    if delta.total_seconds() > SCHEDULER_PREVNEXT_LIMIT_SECONDS:
        return ''

    return '<a href="%s%s"><span class="glyphicon glyphicon-circle-arrow-right"></span></a>' % (
        reverse(target, kwargs=dict(calendar_slug=slug)),
        querystring_for_date(period.next().start, autoescape=True))

我希望这些新信息有所帮助。再次感谢大家。

编辑#2 :我再次查看了有问题的页面的源代码,发现HTML标签&#39;括号被视为转义字符(&lt;):

<div class="row row-centered">
    &lt;a href=&quot;/main/calendar/tri_month/dd/?year=2016&amp;amp;month=2&amp;amp;day=1&amp;amp;hour=0&amp;amp;minute=0&amp;amp;second=0&quot;&gt;&lt;span class=&quot;glyphicon glyphicon-circle-arrow-left&quot;&gt;&lt;/span&gt;&lt;/a&gt;
    &nbsp; <b>March 2016</b> &nbsp;
    &lt;a href=&quot;/main/calendar/tri_month/dd/?year=2016&amp;amp;month=4&amp;amp;day=1&amp;amp;hour=0&amp;amp;minute=0&amp;amp;second=0&quot;&gt;&lt;span class=&quot;glyphicon glyphicon-circle-arrow-right&quot;&gt;&lt;/span&gt;&lt;/a&gt;
</div>

不知何故,通过Python函数返回的HTML代码实际上并未实现。有什么建议吗?

1 个答案:

答案 0 :(得分:0)

经过一些研究后,我发现another StackOverflow post关于通过模板标签返回HTML。我将模板代码更改为

{% autoescape off %}{% prevnext "tri_month_calendar" calendar periods.month "F Y"%}{% endautoescape %}

并且有效。

事实证明我错了,并不是Python代码的错。相反,模板获取了prevnext输出的内容并转义了所有特殊字符。

但是,当我在本地运行项目时,我仍然不明白为什么模板标签没有问题;标签没有被转义。至少问题已经解决了。