Как мне сгенерировать URL с помощью Jinja2 / Flask, если переданные значения содержат '/' или только числа? - PullRequest
0 голосов
/ 24 октября 2019

Я создал веб-сайт с флягой, однако заметил, что URL-адреса, созданные с номерами деталей, содержащими / или все числовые значения, вызывают ошибку 404. Я вручную переключил / на / в базе данных, и страница снова работает.

Как лучше всего решить эту проблему?

Код от main.py

@app.route('/<string:brand>/<int:page>',methods=['GET','POST'])
def view(brand, page):
    per_page = 25
    if bool(FM_comp.query.filter_by(oem_type=brand).first()):
        qry = FM_comp.query.filter(FM_comp.oem_type == brand).paginate(page,per_page)
    else:
        qry = FM_comp.query.filter(FM_comp.oem_number.contains(brand)).order_by(FM_comp.end).paginate(page,per_page)
    return render_template('results.html',table=qry, brand=brand)

@app.route('/<string:brand>/<string:item>',methods=['GET','POST'])
def view_item(brand, item):
    qry = FM_comp.query.filter(FM_comp.oem_type == brand, FM_comp.oem_number.contains(item)).paginate()
    return render_template('view_item.html',table=qry)

results.html

<doctype html>
<title>Search Results - Flask Bearing Database</title>
<html>
    <head>
        <table align=center><tr><td>
            Bearing Interchange
            </td></tr>
            <tr><td align=center>
                {{ brand }}
            </td></tr>
            <tr><td align=center>
                <a align=center href="{{ url_for('.index') }}"> HOME </a>
        </td></tr>
        </table>
    </head>
    <body>
<table width=60% align=center>
    <tr>
        <th>OEM Number</th>
        <th>Description</th>
        <th>Dimensions</th>
    </tr>

    {% for item in table.items %}
        <tr align="center">
            <td width=30%><a href="{{ url_for('.view_item', brand=brand, item=item.oem_number) }}">{{ item.oem_number }}</a></td>
            <td width=30%>{{ item.dis }}</td>
            <td width=30%>{{ item.dim }}</td>
        </tr>
    {% endfor %}
</table>
<table align= center><td>
{% if table.has_prev %}<a href="{{ url_for('.view', brand=brand, page=table.prev_num) }}">&lt;&lt; Newer posts</a>{% else %}&lt;&lt; Newer posts{% endif %} | 
{% if table.has_next %}<a href="{{ url_for('.view', brand=brand, page=table.next_num) }}">Older posts &gt;&gt;</a>{% else %}Older posts &gt;&gt;{% endif %}
</td>
</table>
</body>

view_item.html

<title>Search Results - Flask Bearing Database</title>
<html>
    <head>

    {% for item in table.items %}
        <table align=center><tr><td>
            Beaing Interchange
            </td></tr>
            <tr><td align=center><h1>
                {{ item.oem_type }}
            </h1></td></tr>
            <tr><td align=center><h2>
                {{ item.oem_number | safe }}
            </h2></td></tr>
            <tr><td align=center>
                <a align=center href="{{ url_for('.index') }}"> HOME </a>
        </td></tr>
        </table>
    </head>
<body>
<table width=60% align=center>
    <tr>
        <th>OEM Number</th>
        <th>Description</th>
        <th>Dimensions</th>
    </tr>

        <tr align="center">
            <td width=30%>{{ item.oem_number | safe }}</td>
            <td width=30%>{{ item.dis }}</td>
            <td width=30%>{{ item.dim }}</td>
        </tr>
</table>
{% endfor %}
</body>

У меня такое чувство, что ответом является либо замена всего текста в базе данных на коды символов HTML, либо более глубокое понимание кодировки символов в jinja2. Все, что я прочитал до сих пор, говорит, что Flask по умолчанию utf-8, который совместим с генерацией URL. В какой-то степени я понимаю, почему номера деталей с / не генерируются, однако кто-нибудь знает, почему номера деталей с только числовыми символами также не генерируются? Единственные номера деталей, которые генерируют URL без проблем, это те, которые содержат как цифры, так и буквы или символы.

TLDR: url with '/' or all numbers == 404 FAIL && url with numbers & letters or numbers & symbols or all letters == 200 PASS

...