Python2.7中的错误只需要2个参数(给定1个)

时间:2013-06-05 16:23:59

标签: python

我是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)

1 个答案:

答案 0 :(得分:2)

通常,这意味着您将client_session称为未绑定方法,只给它一个参数。你应该反省一下,看看你在request方法中使用的application()究竟是什么,也许这不是你期望的那样。

要确定它是什么,您始终可以添加调试打印输出点:

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

我希望您能看到该请求是werkzeug为您提供的原始Request课程。

在这里,你正在扩展werkzeug的BaseRequest,并且在application()中你期望werkzeug神奇地了解你自己对BaseRequest类的实现。但是如果你阅读python的禅,你就会知道“显式优于隐式”,所以python从来没有神奇地做过,你必须告诉你的库你以某种方式做了改变。

所以在阅读了werkzeug的文档之后,你会发现实际情况确实如此:

  

使用WSGI环境作为第一个参数创建请求对象,并将自己添加到WSGI环境中作为'werkzeug.request',除非它是在populate_request设置为False的情况下创建的。

对于那些不知道werkzeug是什么的人来说,这可能并不完全清楚,背后的设计逻辑是什么。

但是一个简单的谷歌查找,显示了BaseRequest的使用示例:

我只是从werkzeug.wrappers导入BaseRequest`

搜索

现在,您应该能够猜出应用程序中要更改的内容。由于您只提供了应用程序的一些部分,我无法确切地告知您改变的位置/内容。