我在Flask写了一个小应用程序。
run.py
#!flask/bin/python
from app import app
app.run(debug=True, port=9001)
init .py
from flask import Flask
app = Flask(__name__)
from app import views
的index.html
{% extends "base.html" %}
{% block content %}
<select id = "foo">
{% for item in Citydata %}
<option value = {{ item.link }}> {{ item.name }} </option>
{% endfor %}
</select>
<a href="/new">Click here</a>
{% endblock %}
new.html
{% extends "base.html" %}
{% block content %}
<p>gafgafgadfgaerwgtdfzgaergdfzgaergaergaergt</p>
{% endblock %}
,最后是views.py
from flask import render_template
from app import app
from bs4 import BeautifulSoup
import urllib2
import traceback
class City_Link(object):
name = ""
link = ""
# The class "constructor" - It's actually an initializer
def __init__(self, name, link):
self.name = name
self.link = link
@app.route('/')
@app.route('/index')
def index():
URL = 'http://www.amis.pk/DistrictCities.aspx'
City_Data = scrape(URL)
return render_template("index.html",
title='Home',
Citydata=City_Data)
@app.route('/new/<data>', methods=['GET', 'POST'])
def new(data):
return render_template("new.html",
title='Home',
link = data)
def scrape(url):
data = []
try:
page = urllib2.urlopen(url)
soup = BeautifulSoup(page.read(), "lxml")
table = soup.body.find(id='TABLE1')
for row in table.findAll("tr"):
heads = row.findAll("a")
for head in heads:
data.append((City_Link(head.text.strip(), head.attrs['href'])))
except:
print(traceback.format_exc())
return data
当我点击&#34;点击我&#34; index.html中的href它给我在模板new.html上找不到404。我不明白为什么因为我遵循了基础教程。我尝试更改端口,它工作。但后来我尝试更新代码,它再次破坏了链接。
答案 0 :(得分:1)
因此发生这种情况的原因是因为flask寄存器/ new和/ new /是两条不同的路径。
看起来您实际上并没有将任何数据传递给数据变量。您可以通过将链接更改为指向
来暂时解决此问题/new/something
但这并没有完全解决问题。我建议调整模板代码以使用极好的url_for函数。您可以在此处找到它的扩展文档:http://flask.pocoo.org/docs/0.10/api/#flask.url_for
当我们调整您的代码时,它应该如下所示:
<a href="{{ url_for('new') }}">Click here</a>
并且该数据变量看起来甚至没有使用过!让我们完全剥离它!
@app.route('/new', methods=['GET', 'POST'])
def new():
return render_template("new.html",
title='Home')
这改变了您的代码,我可能没有足够的有关您的用例的信息。如果这修改了它而不是可用于您的应用程序,请告诉我,我会相应地调整我的答案。