반응형
  1. paramiko를 활용하여 간단한 서버 사이드 호출 결과 화면 작성
    • 화면에서 node IP, port, id, 패스워드를 입력하여 node에 접속 후 SSH를 통하여 명령어를 전송 후 화면에 표시
    • 본 문서에서 사용한 명령어는 df -h 명령어를 사용하였음
    • 보안관련 부분은 모두 제외 함 ( 패스워드 마킹, URL 삽입 해킹 등)
    • 작성 화면

    • 결과 화면

  2. 준비 사항
    • paramiko 패키지 설치
    • #pip install paramiko
    • 설치 후 확인
    • #pip show paramiko
    • 위 내용 중 pip업그레이드는 본 문서와 별개이므로 패스 함 # 필요한 경우 업그레이드 해도 무방 함
    Templates 수정 및 작성
    • Template 작성을 위한 디렉토리 이동


      • mainindex.html
        • 사용자로부터 입력값을 전달 받는 화면
      • menu1.html
        • 입력된 값으로 서버에서 paramiko를 활용하여 node에 접속 후 명령어를 실행하여 결과를 표시
    • mainindex.html 수정

    • form 화면은 기본적인 Javascript를 사용하였으며, 필요한 경우 JSON 방식으로 변경하여도 무방
    • {%csrf_token%}   #Cross-site Request Forgery를 방지 하기 위함, Django에서 기본적으로 사용 됨
    • menu1.html 작성

    • {% autoexcape off %} {{data}} {% endautoescape %} 는 표시되는 데이터(data)에 들어있는 HTML 태그를 활성화 하기 위해 사용되는 예약어
    • {{data}}만 사용하는 경우와 {% autoexcape off %} {{data}} {% endautoescape %}로 사용되는 경우에 대해서는 직접 확인하여 숙지 필요 
  3. views.py 수정
    • paramiko 사용을 위해 import 시킴
    • 1 라인 : import paramiko
    • Template에서 action 실행시 받아줄 method를 작성
    • 8 라인 ~ 55 라인 : def menu1(request): 에서 받아서 처리 됨

    • 18 라인 ~ 22 라인 : 함수 내 지역변수 참조 오류를 피하기 위해 함수내 전역변수로 초기화
    • 23 라인 ~ 27 라인 : request에서 post값을 받아오기 위해 처리
      • 일반적으로 Django에서는 forms 개체를 사용하여 화면을 구성하며
      • 이 경우 위 소스와는 틀린 방식으로 구현 됨
      • forms 클래스를 구현하여 작동하는 방식은 추후 다른 문서에서 작성 예정
      • request객체에는 POST를 비롯하여 GET 등 클라이언트로부터 넘어오는 값들이 들어 있음
      • 오류 화면에서 넘어오는 값들을 모두 볼 수 있음
      • POST값으로 넘어오는 IP, PORT, USERID, PASSWORD를 각 변수에 할당
    • 34 라인 ~ 50 라인 : paramiko를 활용하여 Node에 SSH 통신 연결 
      • try: ... except: ... 를 활용하여 예외 처리 (예외 발생시 화면에 오류 표시)
      • 40 라인 : df -h 명령어를 Node에서 실행 
      • 41 라인 : 실행된 결과는 stdout에 저장되므로 stdout값을 data에 저장, 에러시 stderr에 저장 됨 
      • 43 라인 ~ 44 라인 : 결과는 stdout에 \r\n 값으로 포함되므로 for 문장을 활용하여 1 라인씩 읽어들여 HTML태그(<P>...</P>)로 씌움
    • 55 라인 : 최종 작성된 context를 template(menu1.html)에 포함시켜 화면으로 전송
  4. urls.py의 수정
    • 사용자의 action에서 넘어오는 값을 받아 처리하도록 urls.py를 수정
    • action에 /menu1로 구성되어 있으므로
    • urls.py에 /menu1에 대한 액션시 받아들이는 함수 매핑

    • 6 라인 : menu1로 URL에서 넘어오는 경우 views.menu1 함수를 호출 하도록 설정
  5. 결과 확인
    • 목표 화면이 나오는지 확인
  6. 추가 목표
    • 다른 명령어를 수행하여 결과가 나오는지 확인
    • 화면상에서 명령어를 입력받아 처리 후 화면에 표시되도록 설정


반응형

Templates(HTML)에서 사용되는 문법 편

  1. 제어를 위한 문법
    • {% %} 의 기호를 사용
    • 기본 문법은 Python을 따름
    • 반복문
      • {% for data in datalist %} 
      •     {{data}}
      • {% endfor %}
    • 비교문
      • {% if %}
      • {% elif %}
      • {% else %}
      • {% endif %}
    • 값 저장
      • {% with var = data %}
      •   {{ var }} is storaged value
      • {% endwith %}
    • URL 하드 코딩을 방지
      • {% url %}
      • 예) {% url 'namespace: view-name' arg1 arg2 %}
      • namespace는 urls.py에서 설정한 이름
      • view-name은 urls.py에서 설정한 URL패턴 이름
    • CSRF 공격 방지
      • {% csrf_token %} 
      • form x태그 윗줄에 삽입
    • 사용자 정의 태그 및 필터 로딩
      • {% load %}
      • 예) {% load lib package.plib %}
  2. 변수를 위한 문법
    • {{ }} 기호를 사용  
    • 사용기호 주의 : AngularJS의 문법과 비슷함
    • {{ 변수명 }} 으로 사용되며, Django에서 내부의 내용을 출력
    • 생성된 변수의 초기값은 빈 문자열 값
    • 변수명에 . (dot)을 사용하면 다음 순서로 확인 과정을 거침
      • 사전(Dic) 타입인지 확인
      • 해당 속성인지 확인
      • 리스트 타입인지 확인
    • 필터
      • 소문자로 변경 {{ str | lower }}
      • 특수 문자 이스케이프 {{ str | escape }}
      • 특정 갯수 문자 리턴 {{ str | truncatewords: 5}} 앞에서 5개 문자를 리턴 (개행문자 제거됨)
      • 리스트 내용 합치기 {{ listdata | join : " - "}}  listdata의 내용을 - 으로 연결 시켜 리턴
      • 변수 값 확인 {{ variable | default : "None"}}
      • 변수 길이 리턴 {{ variable | length }}
      • HTML 태그 제거 {{ str | striptags }}
      • 변수값이 1이 아니면 접미사 붙임  {{ variable | pluralize : "s" }}  // 값에 따라 작업이 필요할경우 사용
      • 합 연산 {{ variable | add:"2" }} // 문자열의 경우 문자열 조합, 리스트는 리스트를 합침, 숫자는 더함
  3. 기타


반응형
  1. Django의 templates(html)와 views.py를 이용하여 화면 생성

    • 위와 같은 화면을 표시하기 위한 프로그램 작성 방법 설명
  2. 사전 설정
    • 화면에 표현하기 위한 적당한 이미지 파일 생성 
    • 생성된 이미지를 Django가 설치된 서버로 전송
    • 개발환경에서 Static 파일(이미지, CSS 등 정적 파일 모두)을 화면에 표시하기 위해서는
    • 반드시 settings.py 파일 내에서 DEBUG = True 로 설정되어야 함
      • Django는 Development와 Production에 대한 설정 부분이 다소 혼동을 주므로 반드시 확인할 것
      • ※※※※※※※※※※※※※※※※※※※※  추후 settings.py에 대한 설명을 별도 페이지에서 작성 예정 ※※※※※※※※※※※※※※※※※※※※
  3. views.py와 Templates의 연결관계
    • Django는 Templates라는 것으로 화면을 구성할 수 있음
    • 이러한 Templates에는 화면, Html파일을 정의하며, 이 부분은 대부분 staticfiles와는 별개로 사용된다  
  4. views.py 수정
    • main 디렉토리에 있는 views.py 파일을 다음과 같이 수정
    • from django.template import loader     # template를 읽어들이기 위해 사용
    • template = loader.get_template('mainindex.html')   # mainindex.html파일을 loader로 읽어 template 객체에 저장
    • context = { 'username' : 'gunamis', }      # username에 값을 넣어서 context를 생성
    • return HttpResponse(template.render(context, request))      # context를 template객체에 전달하여 최종 html을 생성하여 Http로 Response를 함

  5. mainindex.html 작성
    • templates 폴더를 확인 ( 없으면 생성 )

    • mainindex.html파일을 생성하여 아래와 같이 작성
    • {% load static %}     # static을 로드   이미지 등 static 파일을 사용하기 위해 필요
    • {% static "main.jpg"%}   # static에 명시된 디렉토리명으로 치환 됨, /static/main.jpg
    • HTML소스를 보면 다음과 같이 치환됨

    • {% if username %}       # views.py에서 전달된 context 중 username이 있다면
    • {{ username }}              # username의 값으로 치환
    • {% endif %}                  # if문 종료

  6. 이미지 static 파일 위치
    • 개발 모드에서 Django는 static 파일의 위치가 다소 특이 함
    • 별도로 지정할 수 있을듯 하나, 본 문서에서는 기본 위치로 사용 함
    • ./py36-venv/lib/python3.6/site-packages/django/contrib/admin/static/ 위치에 파일 저장 됨 (각 개인의 환경에 따라 상이 할 수 있음)

    • 위 위치한 곳으로 main.jpg 파일을 업로드 
  7. urls.py 파일 수정
    • root의 urls.py 파일 수정
    • from django.conf import settings                             # conf의 settings 파일을 사용하기 위해 선언
    • from django.conf.urls.static import static                 # static 사용을 위해 선언
    • ]+ static(settings.STATIC_URL, document_root=settings.STATIC_ROOT)        # static 파일 사용을 위해 선언
    • settings.py 파일을 보면 다음과 같이 선언되어 있음

      • 이 위치가 ./py36-venv/lib/python3.6/site-packages/django/contrib/admin/static/의 위치 임
      • DEBUG = True로 반드시 변경
    • """ ... """는 python에서 여러줄 주석 처리 하는 방법 임

  8. 실행
    • 브라우저를 실행하여 확인