Как перебрать несколько серверов баз данных в Flask Mysqldb

0

Я ищу, чтобы пройти через 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 только для имени пользователя базы данных, пароля и сервера базы данных.

db.yaml

mysql_user: 'xxxx' mysql_password: 'xxxxx' mysql_db: 'xxxxx'

Я использую yamlsample.yaml для итерации только для узлов БД.

yamlsample.yaml

  • 192.168.1.10
  • 192.168.1.11
  • 0
    пожалуйста, опубликуйте содержимое файла db.yaml
  • 0
    Спасибо, Муса. Файл Yaml обновлен. (Я использовал дефис в yamlsample, yaml. Однако здесь, в посте, как маркеры). Поэтому, пожалуйста, считайте это дефисом (-).
Теги:
flask

1 ответ

0

Из документов PyYaml

Функция 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, полезный, когда вы открываете файлы из ненадежных источников.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню