0

在 Pocoo-Flask 中,我如何能够在如下模板中定义和使用方法?我对 Python 以及随后的语言的 Web 框架完全陌生。

{%
import socket

def DoesServiceExist(host, port):
    try:
        captive_dns_addr = socket.gethostbyname(host)
    except:
        pass

    try:
        host_addr = socket.gethostbyname(host)

        if (captive_dns_addr == host_addr):
            return False

        s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
        s.settimeout(1)
        s.connect((host, port))
        s.close()
    except:
        return False

    return True
%}
{% if DoesServiceExist("google.com", 80) %}
    <h1>Hello {{ name }}!</h1>
4

1 回答 1

4

而不是在视图中运行一个函数(这是可能的,它们在 jinja2 中称为过滤器)更好的解决方案是让您的视图函数为模板提供一个通过/失败变量并根据该传递失败更改模板所做的事情.

def DoesServiceExist(host, port):
    try:
        captive_dns_addr = socket.gethostbyname(host)
    except:
        pass

    try:
        host_addr = socket.gethostbyname(host)

        if (captive_dns_addr == host_addr):
            return False

        s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
        s.settimeout(1)
        s.connect((host, port))
        s.close()
    except:
        return False

    return True

@app.route("/some_url")
def some_urls_view():
    ServiceExists = DoesServiceExist(host, port)
    name = getname() #I don't know what name is but you'll have to pass it to the template
    return render_template("some_template", ServiceExists=ServiceExists, name=name)

然后在 jinja2 模板中(在本例中名为“some_template”)

{% if ServiceExists %}
    <h1>Hello {{ name }}!</h1>
{% else %}
    <h1>Hello!</h1>
{% endif %}

您传递给 render_template 的每个关键字参数都将在模板被渲染时全局可用。

于 2013-09-14T04:37:49.127 回答