Language/VueJS

Flask param으로 static folder 변경

아르비스 2020. 11. 18. 20:16
#-*- coding:utf-8 -*-

import ssl
import sys, getopt

from flask import Flask, request

....


def setInstance(argv):

    FILE_NAME = argv[0]
    INSTANCE_NAME = ""

    try:
        opts, etc_args = getopt.getopt(argv[1:], "hi:", ["help", "instance="])
    except getopt.GetoptError:
        print(FILE_NAME, '-i <instance name>')
        sys.exit(2)

    for opt, arg in opts:
        if opt in ("-h", "--help"):
            print(FILE_NAME, '-i <instance name>')
            sys.exit()

        elif opt in ("-i", "--instance"):
            INSTANCE_NAME = arg

    if len(INSTANCE_NAME) < 1:
        INSTANCE_NAME = "wd"

    print("INSTANCE_NAME : ", INSTANCE_NAME)

    if INSTANCE_NAME == "wd":
        app.static_folder = os.path.join(ROOT_PATH, 'dist2')

    elif INSTANCE_NAME == "order":
        app.static_folder = os.path.join(ROOT_PATH, 'dist1')



if __name__ == '__main__':
        #ssl_context = ssl.SSLContext(ssl.PROTOCOL_TLS)
        #ssl_context.load_cert_chain(certfile='private.crt', keyfile='private.key' , password='')
        #app.run(host="0.0.0.0", port=443, ssl_context=ssl_context)
    setInstance(sys.argv)
    app.run(port=8080, debug=True)
    #app.run(host="0.0.0.0", port=80, debug=True)

 

 

 


"python 소스코드이름" 명령어를 통해 파이썬 코드를 실행할 수 있다.

명령어 실행시점마다 다른 옵션을 주고 싶은 경우 Command Line Arguments를 이용할 수 있다.

기대되는 결과부터 살펴보고 소스코드를 살펴보자

myapp.py라는 소스코드가 있고 해당 소스코드는 인스턴스명과 채널명을 입력받는다

인스턴스명은 필수이고 채널명은 옵션이라고 가정한다

Short방식(ex. -i) 또는 Long방식(--instance)으로 입력받을 수 있다

잘 모르는 경우 -h 또는 --help 옵션을 통해 사용법을 조회할 수 있다.

# python myapp.py -h 또는 # python myapp.py --help [결과] myapp.py -i <instance name> -c <channel name>

[필수 옵션인 인스턴스명을 입력하지 않은 경우]

# python myapp.py 또는 # python myapp.py -c CHAN1 [결과] myapp.py -i option is mandatory

[필수인 인스턴스명을 올바르게 입력한 경우]

# python myapp.py -i INS1 또는 # python myapp.py -iINS1 또는 # python myapp.py --instance=INS1 또는 # python myapp.py --instance INS1 [결과] INSTANCE_NAME: INS1 CHANNEL_NAME:

[인스턴스명과 채널을 입력한 경우]

# python myapp.py -c CHAN1 -i INS1 또는 # python myapp.py --channel=CHAN1 --instance=INS1 또는 # python myapp.py --channel CHAN1 --instance INS1 [결과] INSTANCE_NAME: INS1 CHANNEL_NAME: CHAN1

[등록되지 않은 옵션을 입력한 경우]

# python myapp.py -j=INS1 [결과] myapp.py -i <instance name> -c <channel name>

위 요건을 만족하는 프로그램을 작성해보자

시작하기 앞서 getopt()함수의 이해가 요구된다

아래 소스 중 "hi:c:"의 의미는 -h, -i, -c 을 기대한다는 의미이다

알파벳 뒤 :기호의 의미는 뒤에 값을 기대한다는 의미다

순서를 섞어서 "c:i:h"와 같이 기입해도 결과는 같다

그리고 3번째 파라미터의 ["help","instance=","channel="]의 의미는

help는 옵션만 --help 이런식으로 입력을 받는다. 뒤에 값은 기대하지 않는다

이름 뒤에 =기호가 있는 instance와 channel은 뒤에 값을 기대한다는 의미이다

즉 --instance=값, --channel=값 또는 --instance 값, --channel 값 등의 형태로 입력을 요구한다

 

getopt — C-style parser for command line options — Python 3.7.1 documentation

getopt — C-style parser for command line options Source code: Lib/getopt.py Note The getopt module is a parser for command line options whose API is designed to be familiar to users of the C getopt() function. Users who are unfamiliar with the C getopt() function or who would like to write les

docs.python.org

마지막으로 주의할 점은 C언어에서 활용하는 타입의 규칙이다.

- 두개와 - 한개 그리고 - 옵션에 =를 사용하면 어떤 부작용이 생기는지 눈으로 확인해보자

# python myapp.py -instance=INS1 [결과 주의!!!] INSTANCE_NAME: nstance=INS1 CHANNEL_NAME: # python myapp.py -i=INS1 [결과 주의!!!] INSTANCE_NAME: =INS1

[전체 소스 코드]

import sys, getopt def main(argv): FILE_NAME = argv[0] # command line arguments의 첫번째는 파일명 INSTANCE_NAME = "" # 인스턴스명 초기화 CHANNEL_NAME = "" # 채널명 초기화 try: # opts: getopt 옵션에 따라 파싱 ex) [('-i', 'myinstancce1')] # etc_args: getopt 옵션 이외에 입력된 일반 Argument # argv 첫번째(index:0)는 파일명, 두번째(index:1)부터 Arguments opts, etc_args = getopt.getopt(argv[1:], \ "hi:c:", ["help","instance=","channel="]) except getopt.GetoptError: # 옵션지정이 올바르지 않은 경우 print(FILE_NAME, '-i <instance name> -c <channel name>') sys.exit(2) for opt, arg in opts: # 옵션이 파싱된 경우 if opt in ("-h", "--help"): # HELP 요청인 경우 사용법 출력 print(FILE_NAME, '-i <instance name> -c <channel name>') sys.exit() elif opt in ("-i", "--instance"): # 인스턴명 입력인 경우 INSTANCE_NAME = arg elif opt in ("-c", "--channel"): # 채널명 입력인 경우 CHANNEL_NAME = arg if len(INSTANCE_NAME) < 1: # 필수항목 값이 비어있다면 print(FILE_NAME, "-i option is mandatory") # 필수임을 출력 sys.exit(2) print("INSTANCE_NAME:", INSTANCE_NAME) print("CHANNEL_NAME:", CHANNEL_NAME) # module이 아닌 main으로 실행된 경우 실행된다 if __name__ == "__main__": main(sys.argv)

끝.