具有4个参数的Jinja2 / Flask url_for创建GET请求

时间:2017-06-17 17:47:21

标签: python html flask jinja2

我的模板中有以下代码:

{% block body %}
  {% for x in range(0, 4) %}
    <a href="{{url_for('quiz', category=category, id=id2,  type=clean_types[x]|string) }}">
    {{clean_answers[x]}}
    </a>
  {% endfor %}
{% endblock %}

但是,对于我的上一个参数,而不是获取:

127.0.0.1:5000/quiz/Books/1/True

我明白了:

127.0.0.1:5000/quiz/Books/1?type=True

你能解释一下为什么会发生这种情况,以及我如何解决这个问题?

我尝试使用和不使用字符串转换,我尝试先将一个单独的变量设置为clean_types[x],然后转换它,但它仍显示为?type = True。

作为参考,clean_types是一个包含4个项目的列表,在各种订单中都是True或False,它会在烧瓶中返回模板时传递。

生成链接的路线是:

@app.route('/quiz/<category>/<int:id>')

def quiz(category, id):

    questions = list(db_quiz.getQuestionsByCategory(category))

    clean_question = questions[id][1]
    print(id)
    print(id+1)
    print(clean_question)

    dirty_answers = []

    for x in range(0, 4):
        dirty_answers.append(questions[0][2 + x])

    shuffled_answers = random.sample(dirty_answers, len(dirty_answers))

    clean_answers = [i.split(',')[0] for i in shuffled_answers]
    clean_types = [i.split(',')[1] for i in shuffled_answers]

    print("---------------")

    print(clean_answers)
    print(clean_types)

    clean_types_v2 = ('ja', 'nee', 'nee', 'nee')

    id2=id+1
    return flask.render_template('quiz.html',
                                 category=category,
                                 id2=id2,
                                 clean_question=clean_question,
                                 clean_types=clean_types,
                                 clean_answers=clean_answers)

基本模板          

<head>
<meta charset="UTF-8">
<title>tinyQuiz</title>
<link rel="icon" type="image/png" href="{{ url_for('static', filename='img/favicon.png') }}" />
<link rel="stylesheet" type="text/css" href="{{ url_for('static', filename='css/reset.css') }}" />
<link rel=stylesheet type=text/css href="{{ url_for('static', filename='css/style.css') }}" />
{% block head %}{% endblock %}
</head>

<body>
<div class="verticalAlign">
    <img src="{{ url_for('static', filename='img/logo.png') }}" />

    <h1>tinyQuiz{% block h1 %}{% endblock %}</h1><br/>
    <h2>{% block h2 %}{% endblock %}</h2><br id="br" />
    <h3>{% block h3 %}{% endblock %}</h3><br/><br id="br"/>

    {% block body %} {% endblock %}
</div>
<script src="{{ url_for('static', filename='js/jquery-3.2.1.js') }}"></script>
</body>
</html>

扩展它的测验模板:

{% extends "base.html" %}

{% block head %}
<link rel=stylesheet type=text/css href="{{ url_for('static', filename='css/quiz.css') }}" />
{% endblock %}

{% block h2 %} You are playing: {{ category.capitalize() }} {% endblock %}

{% block h3 %} {{ clean_question }} {% endblock %}

{% block body %}

{% for x in range(0, 4) %}
    <a  href="{{url_for('quiz', category=category, id=id2, type=clean_types[x]) }}">
        {{clean_answers[x]}}
    </a>
{% endfor %}
{% endblock %}

链接指向的路线是:

@app.route('/quiz/<category>/<int:id>/<type>')
def trivia(category, id, type):
    if type == 'True':
        # scores.append(1) #add one to show you got a question correctly
        return flask.render_template('trivia_true.html')
    else:
        # scores.append(0) #add zero to show you failed to answer correctly
        return flask.render_template('trivia_false.html')

这是github

上项目的链接

2 个答案:

答案 0 :(得分:1)

我看到你的HTML一个href链接是正确的。但是在您的quiz函数路径中,url构造错误,应该是......

@app.route('/quiz/<category>/<int:id>/<type>')
def quiz(category, id, type):

答案 1 :(得分:0)

喔。我的。神。

我是愚蠢的,完全误解了url_for文档。

在url_for开头的'something'是指flask中的函数/路径,并且不像我想的那样只是url的字符串。

将我的链接更改为

        <a  href="{{ url_for('trivia', category=category, id=id2, type=clean_types[x]) }}">

解决了我的问题。

现在当然也很明显为什么它生成了一个GET请求而不是一个普通的链接 - 它将它称为“本身”,因此同一路径上的新参数将是一个GET请求。