TIL - jinja2 / Python 에러

kyoungyeon·2024년 1월 3일
0

TIL

목록 보기
103/110

Status

Jinja2

  • 템플릿 엔진 언어
  • pypi 에서 jinj2를 패키지로 다운받을수 있다!
  • danjgo 쪽에서 html 사이에 직관적인 템플릿 문법이 필요할때 쓴다고 한다
  • 빠르고 확장성 높음.

하지만 Playbook은 예외 / fortinet 관계자들 이상한 fortinet 문법 만들지 말고.. python 써라 쫌..

  • jsx, jquery가 html에서 쓰이는 형식과유사해 보였는데 실제로 jsx처럼 템플릿 언어로서 역할을 수행함
    JSX란

  • 문제는 솔루션 위의 각 node? step 별로 돌아가는 건데 일단 json 형태로 받는 값들을 재 구조화시켜 list로 만들어야 한다.

  • 결국 찾아보니 list 형태로 들어오고있었는데 사전에 전~혀 공유 안되었다.

  • 계속 리스트 json 딕셔너리를 번갈아가며 설명하던 열정만 넘치는 담당자...
    정적인 데이터가 니 맘대로 바뀌는 거니

  • 결국 각 스텝(노드별로) 야근하며 알아봤다 하하

  • 조건문 돌리기 위해서 list를 또 다른 list나 dictionary나 json중 하나로 바꾸라던데 뭐 어쩌라는건지

    • 도대체 뭘로 바꾸라는 건지 결정좀 해..
    • 정적 key 찾아가는 조건문 써가면서 구하면 될텐데.. 왜 다른 list로 형변환을 해야하는지
    • 다른 스텝 써가면서 비효율적으로 해야해..?
    • 우리가 미처 다 공부하지 못한 Playbook GUI에 있지 않을까?
    • 결국 이해포기

얼른 해결해줘버리자

목표 json을 str 으로 만들고 str을 list에 넣자..

  • 기능구현에 충실하려 노력했다.
    input
# 1 
{
  "data": {
    "code_output": [
      "172.16.111.40",
      "172.16.111.160"
    ]
  },
  "status": "Success",
  "message": "",
  "operation": null,
  "execution_time": "149 ms"
}
 
  # 2

{
  "input": "[\"172.16.111.40\", \"172.16.111.160\"]"
  }
   
  • 필요한건 ip 값이여서 일단 set variables을 통해 2번 input 값으로 도출함

  • 문제는 dictionary 형태가 아니라 list의 형태가 필요한 거 같은데..?

  • output
    ["172.16.111.40", "172.16.111.160"]

Jinja 코드의 이해

Err - jinja2 앞뒤에 \n 어떻게 제거하지?

공백제거 /유지
진자문법

  • 양쪽을 다 지우려면 {{%- -%}} 넣으면 된다

Err - str으론 뽑았는데, join 어케쓰지

looping none append

for, join jinja 문법
{varaibles_name|join(",")}

 # for ~ in 문법
 {% for obj in list %}
  • <class:str> 형태로 도출됨
  • 템플릿 엔진 기본제공 변수 loop도 있다!
- loop.index() (0부터 횟수 세기)
- loop.first (반복 처음일 경우 T/ 아니면 F)

Err - jinja2 언어 선언시마다 None 이 붙는다

이유 확인

  • html 템플릿 문법이다보니
    {{}} 이 선언될때마다 return 이 되는 것이다. (div같이 태그가 출력이 되는 모양)
  • 앞뒤로 None 이 계속 붙어서 선언되기에 삭제는 실패...
  • 웹상으로 출력시에는 <script> 로 넘겨버리면 깔끔하게 None이 사라지지만, 현재 Playbook에서 다음 node로 넘겨주기 위해 쓰는 문법이다 보니 좀 아쉬운게 있었음

번외 Python

Err- api를 호출한다는건가요? 값을 대입한다는건가요?

  • test할 적절한 log 가 없어서 개발 팀장님께 문의.
    • jinja 문법인줄 알았는데.. 아니였음.. 공부하자..

  • params['api_body']
    • params 변수에서 'api_body'를 key로 저장한 값의 value를 호출함을 의미합니다.
    • params 타입은 dictionary 이며 이 데이터타입은 key, value로 구성됨을 의미합니다.
  • ip : {{vars.input.params.ip}}
    • 변수 vars의 하위변수 input의 하위변수 params의 변수 ip를 호출하여 ip 변수에 저장함을 의미합니다.

Err- Not Not 처음보는데 뭘 내보내는거죠..?

참고한 python

  • boolean인가? 근데 True/False 대신 다른 변수가 들어가면 어떤 값이 나온다는 거지..?

  • not not(vars.ip)

    • 변수의 값을 boolean 형태로 변환함을 의미합니다.
    • 위 로직은 첫번째 not은 ip을 False로 변환하고, 두번째 not은 False를 True로 변환되어 변수에 True로 저장될 것으로 예상됩니다.

Solved

  • code
{%- set arr1 = [] -%} 
{%- for v in vars.point -%}
{{- arr1.append(v)-}}
{%- endfor -%}
{{- arr1 -}}
  • output
 
  "resultpoint": "NoneNone['172.16.111.40', '172.16.111.160']"
profile
🏠TECH & GOSSIP

0개의 댓글