我想简化/减少我的代码,所以我尝试将重复参数的类的初始化放在他们自己的扩展类中。这是一个基于Pyramid& amp;的REST API。檐口。
当我在初始化时总是添加相同的标头时,如何初始化pyramid.httpexceptions.HTTPUnauthorized?这也适用于其他HTTP响应,我重复初始化它们而不更改其参数。
目前我已经想出了这个来扩展课程:
class _401(HTTPUnauthorized):
def basic_jwt_header(self):
self.headers.add('WWW-Authenticate','JWT')
self.headers.add('WWW-Authenticate', 'Basic realm="Please log in"')
return self
def jwt_header(self):
self.headers.add('WWW-Authenticate','JWT')
return self
我在这样的视图中使用:
@forbidden_view_config()
def authenticate(request):
response = _401()
return _401.basic_jwt_header(response)
但感觉并不正确。有更好,更清洁的方式吗?
答案 0 :(得分:2)
在课堂上创建__init__
方法:
class _401(HTTPUnauthorized):
def __init__(self):
# call base class __init__ first, which will set up the
# headers instance variable
super(_401, self).__init__()
# in Python 3, just use this:
# super().__init__()
# now add the headers that you always enter
self.headers.add('WWW-Authenticate','JWT')
self.headers.add('WWW-Authenticate', 'Basic realm="Please log in"')
resp = _401()
print resp.headers
答案 1 :(得分:1)
由于在实例化_401
实例后使用了两种不同的方法,因此最好使用类级别的工厂方法,这将同时创建实例和期望的标题:
class _401(HTTPUnauthorized):
@classmethod
def basic_jwt_header(cls):
ret = cls()
ret.headers.add('WWW-Authenticate','JWT')
ret.headers.add('WWW-Authenticate', 'Basic realm="Please log in"')
return ret
@classmethod
def jwt_header(cls):
ret = cls()
ret.headers.add('WWW-Authenticate','JWT')
return ret
resp = _401.basic_jwt_header()
print resp.headers
现在无需创建__init__
,或调用super()
或其他任何内容。我们使用cls
代替显式_401
类来支持_401
的任何未来子类化。