2016-08-08 1 views
-1

私はFlaskを使ってよりよく理解しています。私は大きなデータベースを照会し、ランダムな要素を返す単純なアプリケーションを持っています。次のコードは動作しませんが、どこが失敗するのかは正確に分かります。私はrandom.randint()を使ってリスト内のランダムな要素を取得できますが、失敗します。しかし、ログにエラーは表示されませんが、これの根本的な原因は何ですか?私はランダムなintの代わりにハードコードされた値を使用する場合に動作します。私はそれをテストするためにカールを使用します。私は正しいと思われるデータベースコードをスナップしました。Flaskのrandom.randintの使用

from flask import Flask, render_template, request 
import sqlite3 
import random 
app = Flask(__name__) 
def show_home_page(): 
    return render_template("home.html") 

def get_random_element(): 
    # <snipped>: Do some sql queries and populate a list called P_LIST 
    r = random.randint(0, len(P_LIST)) # This line silently fails. 
    r_e = P_LIST[r] # Never seems to get here 
    print "get_random_element", r_e # Never prints this line!! 
    return r_e 

@app.route('/') 
def server(): 
    return show_home_page() 

@app.route('/element', methods=['POST', 'GET']) 
def random(): 
    if request.method == 'GET': 
     p = request.args.get('q', '') 
     print "Request:", p 
     if p == 'random' or p == '': 
      p = get_random_element() 
      print "Random element:", p 
     else: 
      print "Else:", p 
     return render_template('random.html', element=p) 
    return show_home_page() 

if __name__ == '__main__': 
    app.run() 
+0

[documentation](https://docs.python.org/3/library/random.html#random.randint)の 'random.randint'を確認してください。あなたが思っていると思われることはしません。 – user2357112

+0

Didnt get it .. "乱数Nを返すと、<= N <= b。randrange(a、b + 1)のエイリアス"というメッセージが返されます。それは私がしたいことです。私は私のリスト(P_LIST)にランダムなインデックスを探しています。だからrandom.randint(0、len(P_LIST))。 – user3079275

+0

あなたのリストに有効なインデックスは何ですか? 'random.randint(0、len(P_LIST))'の可能な出力は何ですか?矛盾があります。 – user2357112

答えて

0

これは私が理解できないものですが、ここでは何が起こっているのですか。 random()関数の中でrandomをインポートする必要があります。それ以外の場合、グローバルな "import random"文は十分ではないようです。理由は分かりません。だから、random()の中に1つのインポート行を追加すると、それは機能しました。 誰かがこれを説明できるなら、私は感謝します。

編集:今、私は何が起こっているのか理解しています。関数名random()が何らかの矛盾を引き起こしていました。 rand()に変更すると、グローバルインポートが1回だけうまくいきます。

+1

メソッドに 'random'という名前を付けました。これは、あなたがインポートした' random'モジュールをシャドウします –

0

random()という名前の関数を定義して、randomを再定義しました。

@app.route('/element', methods=['POST', 'GET']) 
def random(): 
    ... 

これは、インポートされたモジュールをシャドウし、表示される問題を引き起こします。 import randomにもう一度get_random_element()を入力すると、モジュールrandomにローカルコードrandom()の代わりにコードがアクセスできます。

これを解決するには、関数名を変更します。これはおそらくルート名であるためelement()となります。