2015-05-19 22 views
8

Ho provato l'esempio fornito da esercitazione ufficiale trovato qui:fornitura di variabili per classe in modo dinamico

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

ho fatto un paio di modifiche al codice, e questo è come sembra:

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

Il mio problema è che ho bisogno di fornire l'account = 211829 nell'URL proprio come nome = terra.

Quello che ho scritto qui sotto funziona perché ho fornito il numero di conto alla classe. Come faccio a farlo dinamicamente?

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) 

Come faccio a passare la variabile account_num da PlanetAPI classe per PlanetServiceClass?

risposta

3

Lei avrebbe bisogno di cambiare il vostro URL per

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

Poi nel codice è possibile accedervi tramite

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

EDIT:

Il problema è che si sta attualmente utilizzando account_num per inizializzare il server prima che sia in esecuzione. Quindi devi passarlo dopo che è in esecuzione.

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) 

quindi modificare il resto del codice di nuovo a quello che era nel tutorial:

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

e

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

e dovrei cambiare MyApi a questo? serviceClass = PlanetServiceClass (account_num) – shantanuo

+0

ok aggiorna la risposta. È necessario assegnare "account_num" all'ora "request", non al tempo di inizializzazione del server. –

+0

Grazie. Ha funzionato. Ma funziona solo se copio la funzione myquery in entrambe le classi. Perché? – shantanuo

Problemi correlati