2017-01-05 21 views
-1

外部Webアプリケーションからいくつかのパラメータを要求します。私はフラスコとクエリのデータをMySQLから作成してAPIを作成します。 0 を使用しているときにに修正入力を入力した場合しかしを照会できません。 request.args['name']request.args.get('name')の両方を試してみましたが、例外パスの出力を返します。Flask Python:request.argsを使用してパラメータを取得できません

以下は私の現在のコードです。私が使用した修正入力をコメントアウトします。

from flask import Flask,jsonify,abort,make_response,request,render_template 
import MySQLdb 
import MySQLdb.cursors 

@app.route('/KLSE/search', methods=['GET']) 
def KLSEsearch(): 
    db = MySQLdb.connect(host='vinus.mysql.pythonanywhere-services.com',user='vinus',passwd='Vindex2016',db='vinus$default',cursorclass=MySQLdb.cursors.DictCursor) 
    curs = db.cursor() 
    #name ='P' 
    #macd = 'H' 
    #volumeMin = '_' 
    #volumeMax = '_' 
    #stoch ='H1' 
    #bollinger ='H' 
    #rsi ='H1' 
    #atr ='LV' 
    #trade = 'HOLD' 
    #limit = 3 
    #offSet = 1 
    name = request.args.get('name') 
    volumeMin = request.args['volumeMin'] 
    volumeMax = request.args['volumeMax'] 
    macd = request.args['macd'] 
    stoch = request.args['stoch'] 
    bollinger = request.args['bollinger'] 
    rsi = request.args['rsi'] 
    atr = request.args['atr'] 
    trade = request.args['trade'] 
    limit = request.args['limit'] 
    offSet = request.args['offSet'] 

    query0 = "SELECT * FROM KLSE WHERE Stock LIKE '%s' AND" 
    #query1 = "(Vindex BETWEEN (IF(%s='_',-5000,%s)) AND (IF(%s='_',5000,%s))) AND " 
    query2 = "(Volume_changes_pc BETWEEN (IF (%s='_',-5000,%s)) AND (IF(%s='_',5000,%s))) AND " 
    query3 = "MACD LIKE %s AND " 
    query4 = "STOCH LIKE %s AND " 
    query5 = "BOLLINGER LIKE %s AND " 
    query6 = "RSI LIKE %s AND " 
    query7 = "ATR LIKE %s AND " 
    query8 = "TRADE LIKE %s LIMIT %s OFFSET %s" 
    query = query0+query2+query3+query4+query5+query6+query7+query8 
    input = name+"%",volumeMin,volumeMin,volumeMax,volumeMax,macd,stoch,bollinger,rsi,atr,trade,limit,offSet 
    try: 
     curs.execute(query,(input)) 
     g = curs.fetchall() 
    except Exception: 
     return 'Error: unable to fetch items' 
    #return "hihi" 
    return jsonify({'Stock': g}) 

次のような出力値があります。 MySQLへのクエリが正しいことを示していると思います。引数を使用して、ユーザーの入力値については、 http://vinus.pythonanywhere.com/KLSE/search1

http://vinus.pythonanywhere.com/KLSE/search?atr=%&bollinger=%&macd=%&name=M&rsi=%&stoch=%&volumeMax=&volumeMin=&trade=HOLD&limit=5&offSet=1

正しい方法は何ですか、パラメータを取得? volumeMin、volumeMax、limitおよびoffSetは、浮動小数点数と整数です。

+0

'request.args.get( '値'、デフォルト= 0、タイプ= INT)' request.argsとして[ここでGETメソッドにドキュメントを参照してくださいImmutableMultiDictれる(http://werkzeug.pocoo.org /docs/0.11/datastructures/#werkzeug.datastructures.TypeConversionDict.get) – abigperson

+0

@PJSantoro、 'request.args.get( 'name'、default = 0、type = str)'、 'request.args.get( 'valueMin '、default = 0、type = float) 'と' request.args.get(' limit '、default = 0、type = int) '、それは正しいですか? – vindex

+0

はい、いいですね!おそらく 'request.args.get( 'name'、default = ''、type = str)'を除いて ' – abigperson

答えて

1

まずデータをシリアル化する必要があります。

def serialize(): 
     return { 
      "id" : g.id, 
      "volumeMin" : g.name, 
      "volumeMax" : g.address, 
      "macd" : g.city, 
      "stoch" : g.state, 
      "zipCode" : g.zipCode, 
      "bollinger" : g.bollinger, 
     } 

@app.route("/KLSE/search/.json") 
def stock_json(): 
    query = your.db.query() 
    return jsonify(Stock=[i.serialize for i in query]) 
+0

どのようにシリアル化すれば問題を解決できますか? – vindex