2015-05-19 11 views
8

Ich habe das Beispiel von offiziellen tutorial hier zur Verfügung gestellten versucht:liefert Variablen Klasse dynamisch

http://saratoga.readthedocs.org/en/latest/serviceclasses.html

ich ein paar Änderungen am Code vorgenommen haben, und das ist, wie es aussieht:

http://23.21.167.60:8094/v1/yearlength?name=earth 

Mein Problem ist, dass ich die account = 211829 in der URL wie name = Erde bereitstellen muss.

Was ich unten geschrieben habe funktioniert, weil ich die Kontonummer der Klasse angegeben habe. Wie mache ich das dynamisch?

import json 
from saratoga.api import SaratogaAPI, DefaultServiceClass 

class PlanetServiceClass(DefaultServiceClass): 
    def __init__(self, myaccount): 
     self.yearLength = { 
      "earth": self.myquery(myaccount), 
      "pluto": {"seconds": 7816176000} 
     } 

    def myquery(self, myaccount): 
     import pandas as pd 

     query = ('select * from mydata198 where account = %s ') % (myaccount) 

     import sqlalchemy 
     engine = sqlalchemy.create_engine('mysql+pymysql://dba:[email protected]/test') 
     conn = engine.raw_connection() 

     df=pd.read_sql(query, conn) 
     return df.to_json() 

class PlanetAPI(object): 
    class v1(object): 
     def yearlength_GET(self, request, params): 
      planetName = params["params"]["name"].lower() 
      return self.yearLength.get(planetName) 

APIDescription = json.load(open("planets.json")) 
myAPI = SaratogaAPI(PlanetAPI, APIDescription, serviceClass=PlanetServiceClass('211829')) 
myAPI.run(port=8094) 

Wie gebe ich die account_num Variable von PlanetAPI Klasse PlanetServiceClass?

Antwort

3

Sie müssten Ihre URL zu

http://23.21.167.60:8094/v1/yearlength?name=earth&account_num=12345 

Dann im Code ändern, können Sie es Zugriff über

account_num = params["params"]["account_num"] 

EDIT:

Das Problem ist, dass Sie sich gerade befinden Verwenden Sie account_num, um den Server vor der Ausführung zu initialisieren. Sie müssen es also nach dem Ausführen übergeben.

class PlanetAPI(object): 
    class v1(object): 
     def yearlength_GET(self, request, params): 
      planetName = params["params"]["name"].lower() 
      account_num = params["params"]["account_num"] 

      mysql_result_json = self.myquery(account_num) 
      self.yearLength['earth'] = mysql_result_json # assign to earth if you want, as in your question 
      return self.yearLength.get(planetName) 

dann den Rest des Codes ändern zurück zu dem, was es im Tutorial war:

myAPI = SaratogaAPI(PlanetAPI, APIDescription, serviceClass=PlanetServiceClass()) 

und

class PlanetServiceClass(DefaultServiceClass): 
    def __init__(self): 
+0

und sollte ich MyApi auf das ändern? serviceClass = PlanetServiceClass (account_num) – shantanuo

+0

ok die Antwort aktualisiert. Sie müssen "account_num" zur "request" -Zeit zuweisen, nicht zur Serverinitialisierungszeit. –

+0

Danke. Es funktionierte. Aber es funktioniert nur, wenn ich die myquery Funktion in beiden Klassen kopiere. Warum? – shantanuo

Verwandte Themen