Redash의 파이썬에서 자작 로직을 작동시키는 방법

9493 단어 파이썬redash

1. 소개



・복수의 DataSource로부터 execute_query를 이용해 데이터를 취득해 DataFrame에 가공.
· add_result_row와 add_result_column을 이용하여 Redash용 테이블화.
상기 2점을 실시하는 것이 귀찮았기 때문에, 래퍼 클래스의 작성하기로 했다.

2.환경 파악



Redash는 docker에서 움직이고 있기 때문에,
스크립트는 docker 내부에 설치할 필요가 있다.

3. 디렉토리 구성 결정



Redash 측에 스크립트 경로를 설정하므로 미리 결정해 둘 필요가 있습니다.
이번에는 다음 디렉토리 구성으로 설정합니다.
home
  └ redash
      └ scripts

※scripts 디렉토리 안에 스프릿트를 배치합니다.

4. 로직 생성



래퍼 클래스를 작성합니다.
처음에는 간단한 클래스로 괜찮습니다만, Redash측에 설정하므로 파일명만은 확정시켜 주세요.

wrapper.py
class Test():
    def __init__(self):
        pass
    ...

5.Redash 설정



여기에서 Redash 측의 설정을 변경합니다.

5-1.AdditionalModulesPaths 설정




스크립트를 배치하는 경로를 설정합니다.
[/home/redash/scripts]를 작성합니다.

5-2.Modules to import prior to running the script 설정




가져올 파일 이름을 설정합니다.
wrapper를 입력합니다.
※복수 있는 경우는 쉼표로 구분하여 입력. (쉼표 뒤에는 공간을 비우지 않는 것)

5-3. 설정 저장



Save를 눌러 저장합니다.
설정은 저장되어 있지만 아직 작동하지 않으므로 주의하십시오.

6.Docker를 다시 시작합니다.



컨테이너 자체를 일단 파기하고, 재작성합니다.
docker-compose down
docker-compose up -d

※컨테이너 자체를 고칠 필요는 없을지도 모릅니다만, 일단 재작성하고 있습니다.

6-1 Redash측의 동작



여기는 날려도 설정에 영향은 없습니다.

htps : // 기주 b. 이 m/게 t레다 sh/레다 sh/bぉb/마s테 r/레다 sh/쿠에 ry_루네 r/py 텐. py#L103-L105
        if self.configuration.get("allowedImportModules", None):
            for item in self.configuration["allowedImportModules"].split(","):
                self._allowed_modules[item] = None

Redash가 시작될 때 _allowed_modules 배열에 wrapper 키의 값이 None으로 추가됩니다.

htps : // 기주 b. 이 m/게 t레다 sh/레다 sh/bぉb/마s테 r/레다 sh/쿠에 ry_루네 r/py 텐. py#L107-L110
        if self.configuration.get("additionalModulesPaths", None):
            for p in self.configuration["additionalModulesPaths"].split(","):
                if p not in sys.path:
                    sys.path.append(p)

Redash가 시작되면 환경 변수에 스크립트 경로 "/home/redash/scripts"가 등록됩니다.

7. 스크립트 파일을 Docker로 전송합니다.



아직 엔터티가 Docker 내에 존재하지 않으므로 현재 상태에서 스크립트를 실행하면 파일이 없는 오류가 발생합니다.
그래서, 실체를 Docker내에 전송합니다.
docker cp ./scripts/. `docker-compose ps -q server`:/home/redash/scripts/
docker cp ./scripts/. `docker-compose ps -q worker`:/home/redash/scripts/

스크립트 파일의 소유자가 루트이더라도
스크립트가 실행할 수 있는지 확인하고 있으므로 이 절차에서는 권한을 변경하지 않습니다.

8. 실제로 Redash 내에서 실행합니다.


from wrapper import test

hoge = test()
hoge.fuga()

8-1.Redash측의 동작



htps : // 기주 b. 이 m/게 t레다 sh/레다 sh/bぉb/마s테 r/레다 sh/쿠에 ry_루네 r/py 텐. py#L248-L251
    def run_query(self, query, user):
        self._current_user = user

        try:
        ....

실행할 때 run_query 함수가 실행됩니다.
RestrictedPython으로 설정하고 이동하지만이 기사에서는 언급하지 않으므로 양해 바랍니다.

htps : // 기주 b. 이 m/게 t레다 sh/레다 sh/bぉb/마s테 r/레다 sh/쿠에 ry_루네 r/py 텐. py#L117-L126
    def custom_import(self, name, globals=None, locals=None, fromlist=(), level=0):
        if name in self._allowed_modules:
            m = None
            if self._allowed_modules[name] is None:
                m = importlib.import_module(name)
                self._allowed_modules[name] = m
            else:
                m = self._allowed_modules[name]

            return m

Redash 로직 내에서 가져온 모듈은 custom_import 함수 내에서 importlib를 사용하여 가져옵니다.

10. 참고 사이트



htps : // 이 m / 츠 보야 타이키 / ms / 90d 94553d3
htps : // m / re f t / ms / a d734 dc87c73c 바 459
htps : // / cs. 두 c r. jp/엔기네/레후오렌세/코만 dぃね/cp. HTML

좋은 웹페이지 즐겨찾기