Я создал веб-сайт с флягой, однако заметил, что 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) }}"><< Newer posts</a>{% else %}<< Newer posts{% endif %} |
{% if table.has_next %}<a href="{{ url_for('.view', brand=brand, page=table.next_num) }}">Older posts >></a>{% else %}Older posts >>{% 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