1

私はパイロンを使用していますが、コントローラーの動作は次のとおりです。

 class UserController(BaseController):

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

しかし、私はターボギアで見つけました、私はこのようにすることができます:

 class UserController:

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

パイロンで同じことを行う方法は?


アップデート

私はグーグルで検索し、他のいくつかのフォーラムで質問しましたが、それでも答えが得られません。誰もそのような質問を知りません(または興味がありません)?

4

1 に答える 1

0

create()POSTデータの要素から直接派生したコントローラーのメソッドに引数を指定したいようです。あなたはこれを行うことができますが、それはかなり厄介です。

それを行うための最短の方法(壊れやすい方法)は、アクションのデフォルトとしてそれらの環境変数を使用して、そのようにアクションを定義することです。

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

問題は、面倒に見えるかもしれませんが、最初に示した方法がおそらくそれを行うためのより良い方法であるということです。

本当に面倒になりたい場合は、このロジックをrouting.pyにプッシュできます。このようなロジックはコントローラーに属しているため、POSTデータは、直接ではなく、すでに利用可能です。Routesで条件付きメソッドを使用すると、POSTデータを持つにアクセスできenviron[wsgi.input]、そこから目的のデータを抽出してmatch_dict辞書にプッシュします。これにより、POSTDATAをコントローラーアクションに直接フィードできます。引数。これがrouting.pyの条件関数に関するPylonsBookのセクションであり、SO別のwsgi.input質問についても同様の質問があります。これは本当に直接作業したい場合に役立ちます。

ただし、これらのいずれかの代わりに、元の方法を使用します。

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

コントローラーに到達する前にPOSTデータを解析し、その前にアクションを実行することは間違いなく可能です。ただし、POSTデータを確認し、それをどのように処理するかを決定するのは、ルートの役割やミドルウェアの役割ではなく、コントローラーの役割です。たとえば、routing.pyのPOSTデータをいじり始めることにした場合、Pylonsの緩く結合された利点の一部と、WSGIシバン全体の利点が失われます。

ただし、次のようなPylonsコントローラーが表示されます

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

ただし、そのような場合、「name」と「spam」の値は、POSTデータからではなく、クエリ文字列(およびルートのマップ)から取得されます。

于 2010-09-30T16:24:29.263 に答える