gpt4 book ai didi

python - repoze.who 身份验证失败时如何返回 JSON 输出?

转载 作者:太空宇宙 更新时间:2023-11-03 17:46:45 26 4
gpt4 key购买 nike

我正在写一个repoze.who plugin并希望从 repoze.who 身份验证中间件返回 JSON,并仍然控制 HTTP 状态代码。如何做到这一点?

最佳答案

实现此目的的一种方法是实现 repoze.who Challenger界面。以下解决方案利用了 WebOb 的事实异常(exception)情况,在webob.exc中,可以用作 WSGI 应用程序。以下示例展示了如何在假设的 Facebook 插件中使用它,其中 2.x API允许用户授予对其电子邮件的访问权限,而这可能是成功注册/身份验证所必需的:

import json
from webob.acceptparse import MIMEAccept
from webob.exc import HTTPUnauthorized, HTTPBadRequest


FACEBOOK_CONNECT_REPOZE_WHO_NOT_GRANTED = 'repoze.who.facebook_connect.not_granted'


class ExampleJSONChallengerPlugin(object):
json_content_type = 'application/json'
mime_candidates = ['text/html',
'application/xhtml+xml',
json_content_type,
'application/xml',
'text/xml']

def is_json_request_env(self, environ):
"""Checks whether the current request is a json request as deemed by
TurboGears (i.e. response_type is already set) or if the http
accept header favours 'application/json' over html.
"""
if environ['PATH_INFO'].endswith('.json'):
return True

if 'HTTP_ACCEPT' not in environ:
return False

# Try to mimic what Decoration.lookup_template_engine() does.
return MIMEAccept(environ['HTTP_ACCEPT']) \
.best_match(self.mime_candidates) is self.json_content_type

def challenge(self, environ, status, app_headers, forget_headers):
if FACEBOOK_CONNECT_REPOZE_WHO_NOT_GRANTED in environ:
response = HTTPBadRequest(detail={
'not_granted':
environ.pop(FACEBOOK_CONNECT_REPOZE_WHO_NOT_GRANTED),
})
elif status.startswith('401 '):
response = HTTPUnauthorized()
else:
response = None

if response is not None and self.is_json_request_env(environ):
response.body = json.dumps({
'code': response.code,
'status': response.title,
'explanation': response.explanation,
'detail': response.detail,
})
response.content_type = self.json_content_type

return response

这里的中心点是 response,一个 webob.exc.WSGIHTTPException 子类的实例,被用作 WSGI 应用程序,而且如果responsebody 属性已设置,那么它不会自动生成,我们使用这一事实将响应的正文显式设置为 JSON-我们字典的格式化字符串表示。如果在处理对以“.json”结尾的 URL 的请求期间调用上述挑战者,或者 Accept header 包含 application/json,则响应正文可能会渲染为类似:

{
"status": "Bad Request",
"explanation": "The server could not comply with the request since it is either malformed or otherwise incorrect.",
"code": 400,
"detail": {"not_granted": ["email"]}
}

如果没有,则正文将呈现为 HTML:

<html>
<head>
<title>400 Bad Request</title>
</head>
<body>
<h1>400 Bad Request</h1>
The server could not comply with the request since it is either
malformed or otherwise incorrect.<br /><br />
{'not_granted': [u'email']}


</body>
</html>

关于python - repoze.who 身份验证失败时如何返回 JSON 输出?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29674069/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com