小能豆

Python 递归附加列表函数

py

递归函数存在问题,该问题应该相对简单,但似乎无法正确解决。

我有一个文件夹结构,其中的文件夹可以包含其他文件夹、图像或文件。每个文件夹都有关联的权限。我想让我的函数递归地构建与每个文件夹关联的权限列表。

我有一个函数,如果文件夹有权限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]

编辑

忽略编辑->询问其他问题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

阅读 18

收藏
2025-01-11

共1个答案

小能豆

在 Google App Engine 上使用 Python 进行 SAML 身份验证时,可以使用支持 SAML 协议的第三方库。以下是常见的 Python SAML 库以及如何在 App Engine 环境中使用它们的建议:


1. python-saml (OneLogin)

OneLogin’s SAML Toolkit for Python 是一个流行的库,用于实现 SAML SSO 和 SLO(单点登录和登出)。

安装

pip install python3-saml

特点

  • 支持 SAML 2.0
  • 提供易于配置的示例代码
  • 包括对元数据处理、签名验证和断言的支持

使用步骤

  1. 配置 SAML Service Provider (SP):
    在你的 App Engine 项目中,创建一个 settings.json 文件,用于存储 SAML 的元数据和配置。

  2. 加载并初始化 SAML 工具包:
    ```python
    from onelogin.saml2.auth import OneLogin_Saml2_Auth

def init_saml_auth(req):
auth = OneLogin_Saml2_Auth(req)
return auth
```

  1. 处理登录和登出:
  2. 生成 SSO 登录 URL。
  3. 处理来自 Identity Provider (IdP) 的断言。
  4. 触发 SLO。

  5. 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() }


2. djangosaml2

如果你使用的是 Django 框架(通过 App Engine Flex 环境部署),可以使用 djangosaml2,这是基于 python-saml 的封装。

安装

pip install djangosaml2

使用

djangosaml2 提供现成的 Django 视图来处理 SAML 登录和登出,但它更适合标准 Django 项目。如果在 App Engine 标准环境中使用,则需要对配置稍作调整以适配 GAE 的 WSGI 环境。


3. pysaml2

pysaml2 是一个功能丰富的库,支持更复杂的 SAML 配置。

安装

pip install pysaml2

特点

  • 更低级的 SAML 协议操作支持。
  • 可用于构建复杂的 SAML 集成。

使用

pysaml2 提供了全面的功能,但需要更多手动配置。主要步骤包括:
1. 定义 SAML 配置。
2. 处理 SAML 请求和响应。
3. 验证断言。

示例配置

创建一个 SAML 配置文件(例如 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
    ...

选择合适的库

  • 如果需要简单易用的工具,python-saml 是首选。
  • 如果需要强大的功能和灵活性,选择 pysaml2
  • 如果使用 Django,可以选择 djangosaml2

在 App Engine 上使用时,请确保所有依赖项在环境中正确打包,并适配 HTTP 请求的处理。

2025-01-11