我是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)
答案 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`
搜索现在,您应该能够猜出应用程序中要更改的内容。由于您只提供了应用程序的一些部分,我无法确切地告知您改变的位置/内容。