You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

CKAN扩展开发:无Context时获取用户信息及调用Toolkit方法

在CKAN模板助手等场景获取用户与Context对象的方法

手动构建Context的常用方式

在非API接口场景(比如模板助手、自定义路由处理函数)中,无法直接获取CKAN自动注入的context,但可以通过以下方式手动构建或获取:

1. 从请求环境提取用户信息构建Context

借助ckan.common.request获取当前登录用户,再组装标准context:

from ckan.common import request
import ckan.plugins.toolkit as toolkit

def my_custom_template_helper():
    # 获取当前登录用户名
    user_name = request.environ.get('REMOTE_USER')
    # 构建Context对象
    context = {
        'user': user_name,
        # 可选:获取完整用户对象(需用户已登录)
        'auth_user_obj': toolkit.get_action('user_show')({'ignore_auth': True}, {'id': user_name}) if user_name else None
    }
    # 使用Context调用Toolkit操作,比如package_search
    search_results = toolkit.get_action('package_search')(context, {'q': '*:*'})
    return search_results

2. 利用toolkit.c上下文变量

CKAN在模板渲染流程中会将常用上下文数据存入toolkit.c,直接从中提取用户信息构建Context:

import ckan.plugins.toolkit as toolkit

def another_template_helper():
    # 获取当前登录用户对象
    current_user = toolkit.c.userobj
    # 构建Context
    context = {
        'user': toolkit.c.user,
        'auth_user_obj': current_user
    }
    # 调用API操作,比如获取数据集列表
    dataset_list = toolkit.get_action('package_list')(context, {})
    return dataset_list

3. 处理未登录用户场景

如果用户未登录,toolkit.c.user和request.environ.get('REMOTE_USER')会返回None,此时需注意权限控制:

# 常规场景:遵循CKAN权限规则,未登录用户仅能访问公开数据
context = {
    'user': None,
    'ignore_auth': False
}

# 特殊场景:跳过权限检查(谨慎使用,仅限内部操作)
context = {'ignore_auth': True}

内容的提问来源于stack exchange,提问作者Theo Stefou

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.12 17:01:21