2015-05-19 14 views
8

Próbowałem przykład dostarczone przez oficjalnego poradnika znaleźć tutaj:zaopatrujące zmienne do klasy dynamicznie

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

Zrobiłem kilka zmian w kodzie i tak to wygląda:

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

Mój problem polega na tym, że muszę podać konto = 211829 w adresie URL podobnie jak nazwa = ziemia.

To, co napisałem poniżej, działa, ponieważ dostarczyłem numer konta do klasy. Jak zrobić to dynamicznie?

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) 

Jak mogę przekazać account_num zmienną z PlanetAPI klasę do PlanetServiceClass?

Odpowiedz

3

Trzeba by zmienić adres URL do

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

Następnie w kodzie można uzyskać do niego dostęp za pośrednictwem

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

EDIT:

Problemem jest to, że obecnie za pomocą account_num, aby zainicjować serwer przed uruchomieniem. Musisz go przekazać po uruchomieniu.

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) 

następnie zmienić resztę kodu z powrotem do tego, co było w tutorialu:

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

i

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

i powinien zmienić myAPI do tego? serviceClass = PlanetServiceClass (account_num) – shantanuo

+0

ok zaktualizował odpowiedź. Musisz przypisać 'account_num' w czasie" request ", a nie czasie inicjalizacji serwera. –

+0

Dzięki. Zadziałało. Ale działa tylko wtedy, gdy skopiuję funkcję myquery w obu klasach. Czemu? – shantanuo

Powiązane problemy