递归函数存在问题,该问题应该相对简单,但似乎无法正确解决。
我有一个文件夹结构,其中的文件夹可以包含其他文件夹、图像或文件。每个文件夹都有关联的权限。我想让我的函数递归地构建与每个文件夹关联的权限列表。
我有一个函数,如果文件夹有权限has_read_permission(request)则返回,如果没有True``False
has_read_permission(request)
True``False
我已经构建了一个如下函数:
def get_child_perms(self, folder, request, perm_list): # Folder contains other folders if folder.get_children(): # For every sub-folder for subfolder in folder.get_children(): return perm_list.append(self.get_child_perms(subfolder, request, perm_list)) else: # If folder doesn't have sub-folders containing folders return [folder.has_read_permission(request)]
我一直没有
给定如下文件夹:
Folder (allowed) - Wont check this one |_First Folder (allowed) | |_First sub Folder (restricted) | | |_File | | |_File | | |_Image | |__Second Sub Folder (allowed) |_Second Folder (allowed)
然后运行get_child_perms()会返回 [True,False,True,True] 甚至 [True, [False, True], True]
get_child_perms()
编辑
忽略编辑->询问其他问题Python 递归函数缺少结果
稍微改变了一下,
def get_child_perms(self, folder, request, perm_list): if folder.get_children(): for subfolder in folder.get_children(): perm_list.append(self.get_child_perms(subfolder, request, perm_list)) return perm_list else: return [folder.has_read_permission(request)]
得到:
[[True], [...], [True], [...], [...], [True], [True], [True], [True], [True], [True], [True], [True], [...], [True], [...]] Admin -Folder 1 - Files -Folder 2 - Files -Folder 3 - Files -Folder 4 - SubFolder 1 -SubSubFolder 1 - Files - Files - SubFolder 2 - SubSubFolder 2 - Files - Files -Folder 5 - SubFolder 3 - Files - SubFolder 4 - Files - SubFolder 5 -Files - Files -Folder 6 - Files -Folder 7 - SubFoler 6 - Files - Files -Folder 8 - Files
在 Google App Engine 上使用 Python 进行 SAML 身份验证时,可以使用支持 SAML 协议的第三方库。以下是常见的 Python SAML 库以及如何在 App Engine 环境中使用它们的建议:
python-saml
OneLogin’s SAML Toolkit for Python 是一个流行的库,用于实现 SAML SSO 和 SLO(单点登录和登出)。
pip install python3-saml
配置 SAML Service Provider (SP): 在你的 App Engine 项目中,创建一个 settings.json 文件,用于存储 SAML 的元数据和配置。
settings.json
加载并初始化 SAML 工具包: ```python from onelogin.saml2.auth import OneLogin_Saml2_Auth
def init_saml_auth(req): auth = OneLogin_Saml2_Auth(req) return auth ```
触发 SLO。
App Engine 环境适配: SAML 库需要访问 HTTP 请求对象,而 App Engine 的请求与 WSGI 有些不同。你可能需要适配请求数据,示例: python def prepare_flask_request(request): # For Flask or App Engine, adapt the request to what python-saml expects return { 'https': 'on' if request.is_secure else 'off', 'http_host': request.host, 'script_name': request.path, 'server_port': request.environ['REMOTE_PORT'], 'get_data': request.args.copy(), 'post_data': request.form.copy() }
python def prepare_flask_request(request): # For Flask or App Engine, adapt the request to what python-saml expects return { 'https': 'on' if request.is_secure else 'off', 'http_host': request.host, 'script_name': request.path, 'server_port': request.environ['REMOTE_PORT'], 'get_data': request.args.copy(), 'post_data': request.form.copy() }
djangosaml2
如果你使用的是 Django 框架(通过 App Engine Flex 环境部署),可以使用 djangosaml2,这是基于 python-saml 的封装。
pip install djangosaml2
djangosaml2 提供现成的 Django 视图来处理 SAML 登录和登出,但它更适合标准 Django 项目。如果在 App Engine 标准环境中使用,则需要对配置稍作调整以适配 GAE 的 WSGI 环境。
pysaml2
pysaml2 是一个功能丰富的库,支持更复杂的 SAML 配置。
pip install pysaml2
pysaml2 提供了全面的功能,但需要更多手动配置。主要步骤包括: 1. 定义 SAML 配置。 2. 处理 SAML 请求和响应。 3. 验证断言。
创建一个 SAML 配置文件(例如 saml_config.py):
saml_config.py
CONFIG = { 'entityid': 'https://your-app.appspot.com/saml/metadata', 'service': { 'sp': { 'name_id_format': 'urn:oasis:names:tc:SAML:1.1:nameid-format:emailAddress', 'endpoints': { 'assertion_consumer_service': [ ('https://your-app.appspot.com/saml/acs', 'urn:oasis:names:tc:SAML:2.0:bindings:HTTP-POST') ], 'single_logout_service': [ ('https://your-app.appspot.com/saml/slo', 'urn:oasis:names:tc:SAML:2.0:bindings:HTTP-Redirect') ], }, }, }, 'metadata': { 'local': ['idp_metadata.xml'], # Path to IdP metadata }, 'key_file': 'sp-key.pem', # Path to SP private key 'cert_file': 'sp-cert.pem', # Path to SP certificate }
在代码中加载配置并处理 SAML 操作:
from saml2 import client from saml2.config import Config def saml_login(): conf = Config() conf.load(CONFIG) saml_client = client.Saml2Client(conf) # Trigger authentication process ...
在 App Engine 上使用时,请确保所有依赖项在环境中正确打包,并适配 HTTP 请求的处理。