2016-08-04 3 views
0

Мне нужно получить доступ к информации из моего WTForm в нескольких приложениях @ app.route в моем app.py, чтобы я мог публиковать визуализацию данных для своего приложения. В настоящее время у меня есть страница @app.route(/home/), и введенный пользователем текст на этой странице обрабатывается WTForm, а затем передан в @app.route(/results/), где мой код выполняет некоторый анализ данных, а затем 1) отображает некоторые результаты и 2) сохраняет некоторую другую информацию в JSON , который должен использоваться для D3 в своем собственном @app.route(/visualization/). Из-за осложнений с Javascript я хочу показать свою визуализацию D3 в своем iframe. Прямо сейчас я могу загрузить страницу /home/, набрать текст и нажать «Отправить», после чего перенаправляет меня на /results/ и правильно печатает, кроме iframe. Проблема в том, что я не могу получить @app.route(/visualization/), чтобы получать информацию из моего WTForm (точно так же, как это возможно results), чтобы изображение могло загрузить соответствующий файл JSON.Могу ли я использовать один WTForm для нескольких приложений @ app.route?

Вот некоторые из моих кодов, чтобы лучше проиллюстрировать проблему.

app.py:

# Home 
@app.route("/home/", methods=["GET", "POST"]) 
def gohome(): 
    error = None 
    with open('somedata.pickle', 'rb')as f: 
     some_content = pickle.load(f) 
    try: 
     if request.method == "POST": 
      attempted_pmid = request.form['pmid'] 
    except Exception as e: 
     #flash(e) 
     return render_template("dashboard.html", error=error) 
    return render_template("dashboard.html", some_content=some_content) 


# My WTForm for handling user-entered pmids 
class pmidForm(Form): 
    pmid = TextField('PubmedID') 

# Results 
@app.route("/results/", methods=["GET", "POST"]) 
def trying(): 
    form = pmidForm(secret_key='potato') 
    try: 
     if request.method == 'POST': 
      entry = form.pmid.data #THIS IS THE USER INPUT FROM THE FORM #referencing 'class pmidForm' 
      pmid_list = multiple_pmid_input(entry) #list for handling multiple pmids 
      print(pmid_list) 


      for user_input in pmid_list: 
       print(str(user_input)) 
       user_input = str(user_input) 
       # DO STUFF HERE # 
       # SAVE A JSON FILE TO A FOLDER # 

     return render_template('results.html') 
    except Exception as e: 
     return(str(e)) 


# Visualization 
@app.route('/visualization/', methods=["GET", "POST"]) #for iframe 
def visualization(): 
    #need to get last user_input 
    form = pmidForm(secret_key='potato') 
    try: 
     if request.method == 'POST': 
      entry = form.pmid.data 
      pmid_list = multiple_pmid_input(entry) 

      for user_input in pmid_list: 
       print("This is the user input on /visualization/") 
       print(str(user_input)) 
       user_input = str(user_input) 

       #Load 
       if user_input == pmid_list[-1]: 
        load_path = '/the/path/'+str(user_input)+'/' 
        completeName = os.path.join(load_path, ((str(user_input))+'.json')) 
        print(completeName) 

        with open(completeName, 'w') as load_data: 
         jsonDict = json.load(load_data) 
        print(jsonDict) 
     return render_template('visualization.html', jsonDict=jsonDict) 
    except Exception as e: 
     return(str(e)) 

Так как у меня сейчас, home и results прекрасно работают вместе с существующими WTForm у меня есть. Я сделаю все правильно. Но в results.html нужно загрузить visualization.html в iframe как так:

линии в results.html:

<iframe id="vis1" src="https://www.website.com/visualization/" width="1000" height="1000"></iframe> 

При такой конфигурации, если я запускаю app.py, все, дисплеи, как нормальный, за исключением iframe, который отображает:

местная переменная 'jsonDict', указанная перед присвоением

Здесь, я полагаю, что это по отношению к моей visualization.html, который имеет код дзиндзя:

var myjson = {{ jsonDict|tojson }}; 

Так, очевидно, @app.route(/visualization/) не получает информацию от WTForm, как это должно быть. Как я могу получить эту вторую @app.route, чтобы распознать содержимое в WTForm, как это работает с results?

Кроме того, это может показаться взломанным, но у меня есть очень веские причины для установки моего D3 в iframe. Это потому, что мне нужно иметь возможность переключаться через несколько html, например /visualization /, каждый из которых имеет сложный Javascript, который конфликтует друг с другом. Лучшее, что я могу сделать, это изолировать их всех в iframe.

ответ

0

Ответ: нет, вы не можете отправить одну форму на несколько маршрутов или обмениваться данными между несколькими маршрутами. Мое решение проблемы необходимости обмена данными между несколькими маршрутами заключалось в создании динамических URL-адресов. Поэтому вместо того, чтобы всегда переходить на страницу results, она переходила к results/1234, и таким образом я смог получить доступ к «1234» и использовать его в этом html.

Смежные вопросы