2015-05-19 15 views
8

burada bulduğu resmi öğretici tarafından verilen örnek denedim: Ben kodu birkaç değişiklik yaptıktedarik değişkenler dinamik

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

ve göründüğü gibi nasıl:

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

Benim sorunum, hesap = 211829 URL'sine name = earth.

Aşağıda yazdıklarım çalışıyor çünkü hesap numarasını sınıfa verdim. Bunu dinamik olarak nasıl yaparım?

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) 

nasıl PlanetServiceClass için PlanetAPI sınıftan account_num değişkeni geçmek?

cevap

3

Sen Sonra kodda sen üzerinden erişebilirsiniz

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

için url değiştirmek gerekir

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

DÜZENLEME:

sorun şu anda olmasıdır sunucuyu çalıştırmadan önce başlatmak için account_num'u kullanın. Yani koştuktan sonra onu geçmelisin.

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

ve

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

ve bu konuya MyAPI değiştirmelisiniz:

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) 

sonra tekrar o öğretici içinde ne kod kalanını değiştirmek? serviceClass = PlanetServiceClass (account_num) – shantanuo

+0

tamam cevabı güncelledi. Sunucu başlatma zamanı değil, "request" zamanında "account_num" değerini atamanız gerekir. –

+0

Teşekkürler. İşe yaradı. Ancak, yalnızca myquery işlevini her iki sınıfta da kopyaladığımda çalışır. Niye ya? – shantanuo