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
相关产品推荐
相关产品推荐

