Я ищу, чтобы пройти через 2 сервера баз данных, чтобы получить соответствие для запроса, представленного через форму (example.html), т. app.config['MYSQL_HOST'] = db['mysql_host']
значения конфигурации (app.config['MYSQL_HOST'] = db['mysql_host']
). Если данные не извлекаются с первого сервера базы данных, он должен запрашивать второй. Когда я пытаюсь сделать список для итерации через узлы mysql,
он показывает мне TypeError: list indices must be integers or slices, not str
.
Ниже приведен код работы, когда я установил один сервер базы данных в app.config['MYSQL_HOST'] = db['mysql_host']
. Файл db.yaml
содержит сервер базы данных и информацию о конфигурации.
from flask import Flask, render_template, request
from flask_mysqldb import MySQL
import yaml
import sys
app = Flask(__name__)
db = yaml.load(open('db.yaml'))
app.config['MYSQL_USER'] = db['mysql_user']
app.config['MYSQL_PASSWORD'] = db['mysql_password']
app.config['MYSQL_DB'] = db['mysql_db']
mysql = MySQL(app)
@app.route('/')
def dashboard():
return render_template('dashboard.html')
@app.route('/sdetails')
def sdetails():
return render_template('s.html')
@app.route('/s', methods = ['POST', 'GET'])
def s():
dbhosts = yaml.load(open('yamlsample.yaml'))
dbhosts = list(dbhosts)
if request.method == 'POST':
result = request.form
sname = request.form["Name"]
for i in dbhosts:
app.config['MYSQL_HOST'] = i
cur = mysql.connection.cursor()
slist=cur.execute(slist=cur.execute("select * from table1 WHERE table1.name LIKE '{}'".format(sname))
sdetails=cur.fetchall()
if sdetails != None:
return render_template('results.html', sdetails=sdetails)
else:
continue # I thought continue will take me to the next dbhost. But not happening.
if __name__ == '__main__':
app.run(debug = True)
Я использую db.yaml только для имени пользователя базы данных, пароля и сервера базы данных.
mysql_user: 'xxxx' mysql_password: 'xxxxx' mysql_db: 'xxxxx'
Я использую yamlsample.yaml для итерации только для узлов БД.
Функция yaml.load преобразует документ YAML в объект Python.
>>> yaml.load(""" ... - Hesperiidae ... - Papilionidae ... - Apatelodidae ... - Epiplemidae ... """) ['Hesperiidae', 'Papilionidae', 'Apatelodidae', 'Epiplemidae'] >>> yaml.load(u""" ... hello: Привет! ... """) # In Python 3, do not use the 'u' prefix {'hello': u'\u041f\u0440\u0438\u0432\u0435\u0442!'}
поэтому, когда вы смотрите на него, первый пример вывода представляет собой объект List
python, а второй - словарь в зависимости от аргумента, переданного на load
, в вашем случае он преобразуется в список, как то, что говорит ошибка:
TypeError: list indices must be integers or slices, not str
поэтому вы не можете использовать строку для индексации списка, чтобы решить этот проход yaml.load
содержимого таким образом, чтобы его можно было преобразовать в dict
(измените файл db.yaml).
одна лишняя вещь, чтобы указать, вам лучше использовать функцию yaml.safe_load
, которая не запускает произвольный код из файла yaml, полезный, когда вы открываете файлы из ненадежных источников.