Я попытался создать несколько маршрутов за один раз, используя переменные из базы данных и цикл for.

Я пробовал это

temp = "example"
@app.route("/speaker/<temp>")
def getSpeakerAtr(temp):
    return  '''%s''' % temp

Работает очень хорошо. НО:

for x in models.Speaker.objects:
        temp = str(x.name)
        @app.route("/speaker/<temp>")
        def getSpeakerAtr(temp):
            return  '''%s''' % temp

Не работает. Сообщение об ошибке:

Файл "/Users/yang/Documents/CCPC-Website/venv/lib/python2.7/site-packages/flask/app.py", строка 1013, в декораторе 02:03:04 web.1 | self.add_url_rule (правило, конечная точка, f, ** параметры)

** Причина, по которой я хочу использовать несколько маршрутов, заключается в том, что мне нужно получить полные данные объекта, запросив из маршрута. Например: если мы введем этот URL:

//.../speaker/sam

Мы можем получить объект со значением name как sam. Затем я могу использовать все значения в этом объекте, например, bio или что-то в этом роде. **

0
yang 15 Авг 2014 в 10:04
В этом дизайне есть что-то в корне неправильное, потому что параметр temp в вызове функции getSpeakerAtr(temp) скроет temp, который определен над getSpeakerAtr. Значение temp внутри getSpeakerAtr всегда будет тем, что было дано как часть URL после его части /speaker/.
 – 
Oliver
28 Авг 2014 в 08:46

1 ответ

Лучший ответ

Вам не нужно несколько маршрутов. Только один маршрут, подтверждающий его значение, например:

@app.route('/speaker/<temp>')
def getSpeakerAtr(temp):
    if not any(temp == str(x.name) for x in models.Speaker.objects):
        # do something appropriate (404 or something?)
    # carry on doing something else

Или о ваших настоящих намерениях:

@app.route('/speaker/<name>')
def getSpeakerAtr(name):
    speaker = # do something with models.Speaker.objects to lookup `name`
    if not speaker: # or whatever check is suitable to determine name didn't exist
        # raise a 404, or whatever's suitable
    # we have a speaker object, so use as appropriate
1
Jon Clements 15 Авг 2014 в 11:08
Спасибо за Ваш ответ! но я новичок в серверной разработке. Я добавил дополнительную информацию в вопрос, не могли бы вы взглянуть и помочь мне немного настроить код?
 – 
yang
15 Авг 2014 в 10:46
Хорошо, вам все равно не нужно несколько маршрутов, как я уже сказал. У вас есть единственный маршрут, а затем используйте переданное значение для поиска ... Если у вас есть база данных из 10 миллионов имен, вам не нужны / нужны 10 миллионов маршрутов для его обработки. Возьмите temp или name или как там вы его называете, затем используйте models.Speaker.objects, чтобы выполнить поиск по этому имени, чтобы получить ваш объект. Если он не может его найти, 404 или что-то еще, в противном случае используйте возвращенный объект по своему усмотрению.
 – 
Jon Clements
15 Авг 2014 в 10:50
Я понял. Довольно умный. Но вместо кода (я не мог понять, как это работает ..) я использовал более примитивное решение: theSpeaker = models.Speaker.objects.get (name = name)
 – 
yang
15 Авг 2014 в 11:14