by shigemk2

当面は技術的なことしか書かない

RedashとRestrictedPython

  • RestrictedPython 4.0b8
  • Python 3.7.2

RedashのPythonデータソースでPythonを書けるようになるけど、このPythonデータソースにはRestrictedPythonというモジュールが使われている。 このRestrictedPythonで、使えるPythonの構文を制限することが出来る。

下が例。↓の例をアレンジした。でも TypeError: tuple indices must be integers or slices, not str ってなるのは絶対ちがう挙動だと思う。

from RestrictedPython import compile_restricted
from RestrictedPython.Guards import safe_builtins

safe_builtins = (
    'sorted', 'reversed', 'map', 'reduce', 'any', 'all',
    'slice', 'filter', 'len', 'next', 'enumerate',
    'sum', 'abs', 'min', 'max', 'round', 'cmp', 'divmod',
    'str', 'unicode', 'int', 'float', 'complex',
    'tuple', 'set', 'list', 'dict', 'bool',
)

source_code = """
def add(x):
  return int(x) + 1
"""
# source_code = "import this"

context = {}
try:
    byte_code = compile_restricted(source_code, '<inline>', 'exec')
    exec(byte_code, {'__builtins__': safe_builtins}, context)
except SyntaxError as e:
    raise e
assert 2 == context['add'](1)

構文制限よりも、Redash的にはグローバルにimportを使わないで関数の中で使うよう求められている。 でもRedashのソースを見る限りだと、ふっつーにintとかstrとか使えてんだよなー。safe_builtinsに定義されているってことは、そこに書いてあるワードは使えないはずなんだけど。

なんだかよくわからない。

rokujyouhitoma.hatenablog.com

redash/python.py at v6.0.0 · getredash/redash · GitHub