티스토리 뷰

728x90

[웹 앱프로그래밍] 파이썬 플라스크(Python Flask) Request get parameter(HTTP method GET, POST)

 

[웹 앱프로그래밍] 파이썬 플라스크(Python Flask) Request get parameter(HTTP method GET, POST)

Request를 배웠으니 이제 html 에서 사용자가 입력한 데이터를 전송 해서 Flask로 받아서 처리 해야 됩니다. GET 이냐 POST냐 구분 까지 했고 html 에서 전달된 데이터를 Flask 에서 어떻게 처리 하는지 알�

wings2pc.tistory.com

위 글의 소스를 이용 해서 브라우저에서 GET 과 POST 로 전달되는 데이터를 받아 파이썬에서 다뤘던 파일 입출력을 이용해서 파일에 쓰기와 읽기를 해봅니다. 저장 위치는 static 폴더에 save.txt 라는 파일로 저장합니다.

num = request.form["num"]
name = request.form["name"]
with open("static/save.txt","w", encoding='utf-8') as f:
    f.write("%s,%s" % (num, name))

 

전체 소스는 다음과 같습니다.

@app.route('/method', methods=['GET', 'POST'])
def method():
    if request.method == 'GET':
        # args_dict = request.args.to_dict()
        # print(args_dict)
        num = request.args["num"]
        name = request.args.get("name")

        return "GET으로 전달된 데이터({}, {})".format(num, name)
    else:
        num = request.form["num"]
        name = request.form["name"]
        with open("static/save.txt","w", encoding='utf-8') as f:
            f.write("%s,%s" % (num, name))
        return "POST로 전달된 데이터({}, {})".format(num, name)

확인을 누르면 save.txt 파일이 생성이 되고 입력한 데이터가 저장이 됩니다.

저장된 파일을 확인했으면 이제 저장된 파일의 내용을 읽어와서 브라우저에 출력을 해봅니다.

 

@app.route('/getinfo')
def getinfo():
    # 파일 입력
    with open("static/save.txt", "r", encoding='utf-8') as file:
        student = file.read().split(',')  # 쉽표로 잘라서 student 에 배열로 저장
    return '번호 : {}, 이름 : {}'.format(student[0], student[1])

이렇게 파일 쓰기와 읽기로 데이터를 저장하고 불러오기를 했습니다.

이전에 만든 게임으로 파일에 저장을 해봅니다. 딕셔너리 값을 파일에 쓰기를 했습니다.

character = {
    "name": name,
    "lv": 1,
    "hp": 100,
    "items": ["대나무헬리콥터", "빅라이트", "어디로든 문"],
    "skill": ["펀치", "핵펀치", "피하기"]
}
f = open("save.txt", "w")
# f.write("name:{}\n".format(name))
for key in character:
    if type(character[key]) is list:
        for i in character[key]:
            print("%s:%s" % (key, i))
            f.write("%s:%s\n" % (key, i))
    else:
        print("%s:%s" % (key, character[key]))
        f.write("%s:%s\n" % (key, character[key]))
f.close()

이런식으로 파일을 저장 했습니다. save.txt  파일의 저장 내용은 키:값 으로 저장이 될겁니다.

파이썬에서 딕셔너리의 값을 파일에 쓸 때 조금 편하게 저장 시킬 수 있습니다. 바로 JSON 이 키:값 쌍으로 되어 있는 대표적인 데이터 포맷 입니다. Javascript의 사용이 늘어 나면서 통신 할 때 주고 받는 Json을 많이 쓰입니다.(이젠 거의 이렇게 통신을...)

파이썬에서도 당연히 json 을 지원 하기 때문에 json 모듈을 import 해서 사용할 수 있습니다.

이제 저 코드를 json 을 이용하여 바꿔 보도록 하겠습니다. json.dump(딕셔너리, 파일 객체) 를 사용합니다.

import json
character = {
    "name": "도라에몽",
    "lv": 1,
    "hp": 100,
    "items": ["대나무헬리콥터", "빅라이트", "어디로든 문"],
    "skill": ["펀치", "핵펀치", "피하기"]
}

with open('save.txt', 'w', encoding='utf-8') as f:
    json.dump(character, f)

소스가 정말 간결해 졌습니다. 저장된 save.txt 파일을 확인 해봅니다.

{"name": "\ub3c4\ub77c\uc5d0\ubabd", "lv": 1, "hp": 100, "items": ["\ub300\ub098\ubb34\ud5ec\ub9ac\ucf65\ud130", "\ube45\ub77c\uc774\ud2b8", "\uc5b4\ub514\ub85c\ub4e0 \ubb38"], "skill": ["\ud380\uce58", "\ud575\ud380\uce58", "\ud53c\ud558\uae30"]}

 

우리가 원하는 결과가 아닌거 같습니다. 숫자와 영어는 제대로 표현이 되는데 한글은 이상한 문자로 나옵니다. json.dump를 사용 하면 한글이 유니코드로 나오는 문제가 발생합니다. 파일을 open해서 encoding 설정도 utf-8로 해줬는데도 정상적으로 표현이 되지 않습니다. json.dump 에 옵션을 줘야 해결이 가능 합니다. ensure_ascii=False 를 넣어 주고 실행 해봅니다. 

with open("save.txt", "w", encoding='utf-8') as f:
    json.dump(character, f, ensure_ascii = False)
{"name": "도라에몽", "lv": 1, "hp": 100, "items": ["대나무헬리콥터", "빅라이트", "어디로든 문"], "skill": ["펀치", "핵펀치", "피하기"]}

한글이 정상으로 표시가 됩니다. 한줄로 적혀 나와 보기가 안 좋습니다. indent='\t' 또는 indent=4 옵션을 사용 해서 이쁘게 출력 해보도록 해봅시다.

 

파일을 열어 확인 해보면 우리가 원하는 결과로 나왔네요. 이제 다시 이파일을 읽어 와서 딕셔너리로 가져 와서 데이터를 사용 해봅니다.

json의 데이터를 파이썬 딕셔너리로 가져오는 방법은 json.loads() 를 이용 합니다.

파일을 읽어온 데이터를 json.loads() 에 전달 해서 딕셔너리로 받습니다.

with open("save.txt", "r", encoding='utf-8') as f:
  data = f.read()
  character = json.loads(data)

print(type(character))
print(character)

<class 'dict'>
{'name': '도라에몽', 'lv': 1, 'hp': 100, 'items': ['대나무헬리콥터', '빅라이트', '어디로든 문'], 'skill': ['펀치', '핵펀치', '피하기']}

type 을 확인 하면 딕셔너리로 나오는것을 확인 할 수 있습니다.

 

만약 데이터가 엄청 많아지면 관리가 쉽지 않습니다. 파일도 늘어 나고...

그래서 우리는  데이터 베이스를 사용해야 합니다.

다음 주에는 DB를 다뤄 보겠습니다. 

 

 

 

댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/11   »
1 2
3 4 5 6 7 8 9
10 11 12 13 14 15 16
17 18 19 20 21 22 23
24 25 26 27 28 29 30
글 보관함