4

私はPythonの初心者です。なぜエラーをスローしているのか不思議です。TypeError: client_session() は正確に 2 つの引数を取ります (1 つ指定) というエラーが表示されます。client_session メソッドは SecureCookie オブジェクトを返します。

ここにこのコードがあります

from werkzeug.utils import cached_property
from werkzeug.contrib.securecookie import SecureCookie
from werkzeug.wrappers import BaseRequest, AcceptMixin, ETagRequestMixin,

class Request(BaseRequest):

 def client_session(self,SECRET_KEY1):
  data = self.cookies.get('session_data')
  print " SECRET_KEY " ,  SECRET_KEY1 
  if not data: 
   print "inside if data" 
   cookie = SecureCookie({"SECRET_KEY":    SECRET_KEY1},secret_key=SECRET_KEY1)
   cookie.serialize() 
   return cookie 
  print 'self.form[login.name] ', self.form['login.name'] 
  print 'data new' , data
  return SecureCookie.unserialize(data, SECRET_KEY1)


#and another 
class Application(object):
 def __init__(self):
  self.SECRET_KEY = os.urandom(20)

 def dispatch_request(self, request):
  return self.application(request)

 def application(self,request): 
  return request.client_session(self.SECRET_KEY).serialize() 


 # This is our externally-callable WSGI entry point
 def __call__(self, environ, start_response):
  """Invoke our WSGI application callable object""" 
  return self.wsgi_app(environ, start_response)
4

1 に答える 1

2

通常、これは をclient_sessionバインドされていないメソッドとして呼び出し、引数を 1 つだけ指定することを意味します。少し内省requestし、メソッドで使用しているものを正確に確認する必要があります。application()おそらく、それはあなたが期待しているものではありません。

それが何であるかを確認するために、いつでもデバッグ出力ポイントを追加できます。

print "type: ", type(request)
print "methods: ", dir(request)

Requestrequest がwerkzeug が提供する元のクラスであることがわかると思います...

ここではBaseRequest、werkzeugの を拡張しています。この中で、 application()werkzeug がクラスの独自の実装を魔法のように知っていることを期待していますBaseRequest。しかし、python の zen を読めば、「明示的は暗黙的よりも優れている」ことがわかるでしょう。そのため、python は決して魔法のようなことをしません。何らかの方法で変更を加えたことをライブラリーに通知する必要があります。

したがって、werkzeug のドキュメントを読んだ後、これが実際に当てはまることがわかります。

request オブジェクトは、最初の引数として WSGI 環境で作成され、populate_request を False に設定して作成されない限り、'werkzeug.request' として WSGI 環境に自身を追加します。

これは、werkzeug とは何か、背後にある設計ロジックが何であるかを知らない人にとっては、完全に明確ではないかもしれません。

しかし、単純な Google 検索で、BaseRequest の使用例が示されました。

私は werkzeug.wrappers import BaseRequest` からのみ検索しました

これで、アプリケーションで何を変更する必要があるかを推測できるはずです。アプリケーションの一部しか提供されていないため、どこをどのように変更すればよいかを正確にアドバイスすることはできません。

于 2013-06-05T16:29:20.010 に答える