我有这个应用程序,我想将一些Web界面部署到syslog服务器。
所以syslogserver确实把他的东西写进了mysql数据库。我已经有了构建 应用程序的一些部分,除了我要构建下拉选择表单的特定部分,以选择数据库中的主机表。
实际上我正在使用烧瓶,烧瓶 - sqlalchemy和wtforms。所以我尝试在QuerySelectField'上实现这个,不知怎的,我只得到一个没有显示表名条目的下拉列表。
我应该提一下,数据库内部的表是动态创建的。对于我的模型,我使用了sqlalchemy的automap_base()功能:
model.py
Base = automap_base()
engine = create_engine("mysql://sumuser:tehpass@127.0.0.1/syslog")
Base.prepare(engine, reflect=True)
session = Session(engine)
这是我的表格中的内容:
forms.py
def factoryHelper():
return session.query("information_schema.tables.table_name from information_schema.tables where information_schema.tables.table_name like 'messages_hostname0'")
class HostSelectForm(Form):
title = TextField('Fooblah')
hostTables = QuerySelectField(query_factory=factoryHelper,allow_blank=True)
并且在视图中:
views.py
@app.route('/index/', defaults={'page':1})
@app.route('/index/page/<int:page>')
def index(page):
form = HostSelectForm()
count = session.execute("select host,facility,level,msg from messages_hostname0").rowcount
pagination = Pagination(page, PER_PAGE, count)
return render_template('index.html', pagination=pagination, form=form)
那么我还能从动态创建的表名创建一个下拉菜单吗?如果我使用自动功能?提前谢谢。
答案 0 :(得分:0)
不知怎的,我设法在model.py中解决了这个问题:
def reflectTables():
for i in Base.classes.items():
yield i[0]
def stripTables():
tablelist = []
datelist = []
re0 = r"^(?P<prefix>[a-zA-Z]*)\_(?P<mid>[a-zA-Z,0-9]*)\_(?P<suffix>[0-9]*)"
myre = re.compile(re0, re.MULTILINE)
for x,table in enumerate(reflectTables()):
striptablename = re.match(myre, table.strip("\n"))
if striptablename:
tablelist.append((x, striptablename.group(2)))
datelist.append((x, striptablename.group(3)))
return dicht(tablelist,datelist)
forms.py:
AVAILABLE_CHOICES = stripTables()
class HostSelectForm(Form):
tableSelect = SelectField('LogHost', choices=AVAILABLE_CHOICES, default=0)
和finnaly在views.py:
中 if request.method == "GET":
count = session.query("* from mytable_monitory_counts")
items = session.execute("select * from mytable_%s_%s limit %s, %s" % \
(tableslector[int(request.values['tableSelect'])][1],\
datelist[int(request.values['tableSelect'])][1], my_start_range, PER_PAGE)).fetchall()
pagination = Pagination(page=page, total=count.count(), search=search, record_name='hosts')
if not items and page != 1:
in_error()
return render_template('index.html', pagination=pagination, form=form, items=items)