Domanda

Sto utilizzando tralicci, e la mia azione del controller è:

 class UserController(BaseController):

      def create(self):
           name = request.POST['name']
           email = request.POST['email']
           password = request.POST['password']
           ...

Ma ho trovato in TurboGears, posso fare in questo modo:

 class UserController:

      def create(self, name, email, password):
           ...

Come fare lo stesso in tralicci?


Aggiorna

Ho cercato in Google, e ha chiesto in alcuni altri forum, ma ancora non ottenere la risposta. Nessuno sa (o interessate a) una domanda del genere?

È stato utile?

Soluzione

Sembra che si vuole dare argomenti al metodo create() del controller che sono derivati ??direttamente dalla elementi dei dati POST. È possibile farlo, ma è piuttosto laborioso.

La via più breve per farlo - un modo fragile -. Sarebbe definire solo l'azione in questo modo, utilizzando le variabili d'ambiente come valori predefiniti per l'azione

class UserController(Base):
  def create(self, name=request.POST['name'], email=request.POST['email'], ...):
        ...

Il fatto è che, anche se può sembrare ingombrante, il primo metodo hai mostrato è probabilmente un modo migliore per farlo, perché ti dà più spazio per recuperare con grazia da quelle variabili non essere quello che ci si aspetta che siano.

Se avete voglia davvero poco pratici, si può spingere questa logica in routing.py. I dati POST è già disponibile qui, non solo come direttamente, perché la logica come questo appartiene nel controller. Si potrebbe utilizzare un condizionale metodo Routes , che consente di accedere a environ[wsgi.input] , che ha i dati POST, quindi estrarre i dati desiderati da lì , e spingerlo nel dizionario match_dict, che a sua volta permetterà di alimentare il POSTDATA direttamente agli argomenti della vostra azione di controllo. Ecco la sezione Piloni Libro sulle funzioni condizionali in instradamento .py, ed ecco una simile domanda qui su SO e un'altra , che dovrebbe aiutare se si vuole veramente a lavorare con wsgi.input direttamente.

Tuttavia, invece di una di quelle cose, vorrei utilizzare il metodo originale:

class UserController(BaseController):
    def create(self):
       name = request.POST['name']
       email = request.POST['email']
       password = request.POST['password']
       ...

E 'sicuramente possibile analizzare i dati POST prima che arrivi al controller e per effettuare delle azioni prima di allora. Tuttavia, guardando i dati POST e decidere cosa fare con esso è il ruolo di un controllore, non il ruolo Routes' o un ruolo middleware. Se si decide di - per esempio - inizia a giocherellare con i dati POST in routing.py, stai perdendo alcuni dei vantaggi loosely-coupled di piloni e, in misura più piccola tutta la baracca WSGI.

vedi controller Piloni che assomigliano a questo, però:

class UserController(BaseController):
    def create(self, name, spam):
       ...

Tuttavia, in questi casi, i valori di "nome" e "spam" provengono dalla stringa di query (e dalla carta Percorsi), non dai dati POST.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top