アクションがより多くのパラメーターをサポートする方法は?
-
02-10-2019 - |
質問
私はパイロンを使用していますが、コントローラーのアクションは次のとおりです。
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):
...
パイロンで同じことをする方法は?
アップデート
私はGoogleで検索し、他のいくつかのフォーラムで尋ねましたが、それでも答えが得られません。誰もそのような質問を知りません(または興味がありますか?
解決
あなたはに議論をしたいように聞こえます create()
ポストデータの要素から直接導出されるコントローラーの方法。あなたはこれを行うことができますが、それはかなり気分が悪いです。
それを行うための最短の方法 - 壊れやすい方法 - は、そのようなアクションを単に定義することです。これらの環境変数をアクションのデフォルトとして使用することです。
class UserController(Base):
def create(self, name=request.POST['name'], email=request.POST['email'], ...):
...
問題は、それが面倒に見えるかもしれないとしても、あなたが最初に示した方法はおそらくそれを行うためのより良い方法だということです。
本当に気分が悪くなりたいと思うなら、このロジックをrouting.pyにプッシュすることができます。このようなロジックはコントローラーに属しているため、ポストデータは既に直接利用可能ではありません。あなたはaを使用します ルートの条件付き方法, 、それはあなたにアクセスを与えます environ[wsgi.input]
, 、ポストデータを持っている後、そこから目的のデータを抽出し、 match_dict
辞書。これにより、ポストデータをコントローラーアクションの引数に直接送り込むことができます。 条件付き機能に関するパイロンブックセクションは次のとおりです Routing.pyで、これがaです ここで同様の質問があります と 別, 、あなたが本当に一緒に仕事をしたいなら、それは役立ちます wsgi.input
直接。
ただし、これらのいずれかではなく、元の方法を使用します。
class UserController(BaseController):
def create(self):
name = request.POST['name']
email = request.POST['email']
password = request.POST['password']
...
ポストデータがコントローラーに到達する前に、ポストデータを解析し、それ以前にアクションを実行することは間違いなく可能です。ただし、ポストデータを見て、それをどうするかを決定することは、ルートの役割やミドルウェアの役割ではなく、コントローラーの役割です。たとえば、routing.pyの投稿データをいじることに決めた場合、パイロンのゆるく結合された利点のいくつかを失い、WSGIシバン全体の程度は少ない。
君 意思 ただし、次のように見えるパイロンコントローラーを参照してください。
class UserController(BaseController):
def create(self, name, spam):
...
ただし、そのような場合、「名前」と「スパム」の値は、ポストデータからではなく、クエリ文字列(およびルートのマップから)から得られます。