2016-11-05 7 views
0

機能からフラスコリダイレクトを返すことに問題があります。私はおそらく単純なものが欠けているかもしれませんが、本当に助けに感謝します。ここでフラスコリダイレクト機能として戻りません

は、私のviews.pyここ

from .tasks import get_stuff 
from flask import render_template 


@app.route('/get-stuff') 
    def get_stuff(stuff_name): 
     stuff = get_stuff(stuff_name) 
     return render_template('stuff.html', stuff=stuff) 

がSOME_VARIABLEがあるのでtasks.py

import os 

from flask import redirect, request, url_for 


def get_stuff(stuff_name): 
    if os.environ.get('SOME_VARIABLE') is None: 
     return redirect(url_for('some_url', next=request.url)) 
    stuff = "Some stuff here" 
    return stuff 

そして、私のstuff.htmlので

{% extends 'base.html' %} 
{% block content %} 
<div class="container-fluid"> 
    <div class="row"> 
     <div class="col-sm-12"> 
      <h1 class="uppercase">{{ stuff }}</h1> 
      <hr> 
     </div> 
    </div> 
</div> 
{% endblock %} 

である私の機能です設定されていない別のページにリダイレクトして、ユーザーにSOME_VARIABLEを設定させます。しかし、これは起こっていない私は<Response 241 bytes [302 FOUND]>を取得しています。どんな助けでも大歓迎です。

答えて

1

しかし、タスクの呼び出しの結果が何であれ、ハンドラ内ではまだreturn render_templateが呼び出されています。リダイレクトの場合は、その結果を直接返す必要があります。

潜在的にあなたが何をすべきかを呼び出し元の関数を伝えるために、そのタスクからだけでなくフラグを返すことができます:

if os.environ.get('SOME_VARIABLE') is None: 
    return True, redirect(url_for('some_url', next=request.url)) 
stuff = "Some stuff here" 
return False, stuff 

とハンドラで:

redirect, stuff = get_stuff(stuff_name) 
if redirect: 
    return stuff 
return render_template('stuff.html', stuff=stuff) 

しかし、本当にこれは、すべてのはるかです複雑すぎる。何が起こっても、応答を返すタスクを取るか、ハンドラではなくテンプレートをレンダリングするか、またはロジック全体をハンドラ関数に移動する必要があります。

+0

Daniel、この有益な説明をありがとうございます。問題を適切に理解し解決するのに役立ちました。 –

0

tasks.pyに一度、views.pyに2回、get_stuffという機能が2回定義されています。

私が気づいた第2の事は、/some_urlに経路変更されていますが、あなたは実際にその経路を定義していません。

関連する問題