(03.31) 네번째 Python

13236 단어 3월기본 Python3월

Flask(웹 프레임워크)

어제는 플라스크를 통해 웹페이지를 만들고 이때까지 배운 html언어와 새로운 python 명령어들을 통하여 웹페이지와 상호작용되는 도구들을 사용해 봤다. 오늘도 그 연장선이다.

from flask import Flask

어제 배운 플라스크를 가져오는 것이고 오늘은 새로 request와 redirect를 가져올 것이다. 가져오는 이유는 바로 내장이 안되있다면 플라스크에서 그 기능을 가져와야만 사용이 가능하기 때문이다.

from flask import Flask, request, redirect

request, method

오늘은 새로운 method라는 것에 대해 배웠는데 http가 웹페이지에 접근 할때는 몇가지의 방법이 있는데 기본적으로는 GET이라는 방법을 쓰는데 method 옵션을 추가함으로써 다른 방식을 쓸수가 있다.
그 중 하나가 POST인데 POST는 서버에 직접 글을 저장하게 끔 해주는 옵션이라 생각하면 된다.

topics = [
  {"id":1, "title":"html", "body":"html is ...."},
  {"id":2, "title":"css", "body":"css is ...."},
  {"id":3, "title":"js", "body":"js is ...."}
]
nextId = 4
def template(content, id=None):
  liTags = ''
  for topic in topics:
    liTags = liTags + f'<li><a href="/read/{topic["id"]}/">{topic["title"]}</a></li>'
  return f'''
  <html>
    <body>
      <h1><a href="/">WEB</a></h1>
      <ol>
        {liTags}
      </ol>
      {content}
      <ul>
        <li><a href="/create/">create</a></li>
        <li>
          <form action="/delete/{id}/" method="POST">
            <input type="submit" value="delete">
          </form>
        </li>
      </ul>
    </body>
  </html>
  '''
@app.route('/create_process/', methods=['POST'])
def create_process():
  global nextId
  title = request.form['title']
  body = request.form['body']
  newTopic = {"id":nextId, "title": title, "body": body}
  topics.append(newTopic)
  nextId = nextId + 1
  return redirect(f'/read/{nextId-1}/')

우리는 어제 글을 쓸 수 있는 도구를 만들었고 이 도구는 표현하자면

@app.route('/create/')
def create():
content = '''
  <form action="/create_process/" method="POST">
    <p><input type="text" name="title" placeholder="title"></p>
    <p><textarea name="body" placeholder="body"></textarea></p>
    <p><input type="submit" value="create"></p>
  </form>
'''
return template(content)

위와 아래의 코드에서 보듯이 method를 POST로 함으로써 입력된 내용을 서버로 직접 전송하여 저장 시킬 수 있게 된다.

그리고 topics의 리스트에는 id가 1~3인 3개밖에 없지만 이후에 직접 입력함으로써 id를 늘릴 수 있게 하기 위하여 newId라는 변수를 넣고 'topic.append(newTopic)'이라는 명령어를 사용하여 리스트에 새로운 것을 추가 하며 'nextId = nextId + 1'을 정의 하여 nextId의 숫자가 점점 커질 수 있게 설정했다. 하지만 nextId는 위에서 정의 했듯이 4로 정해져있다. 그렇기에 이 문법에서만 사용가능하게 'global nextId'라는 것을 설정해준다.

redirect

그리고 위에서 redirect를 얘기했는데
이것에 대해 다시 얘기하자면 redirect는 말 그대로 호출이라고 생각하면 될 것 같다. 라우터를 호출하는 역할로 변수를 더한 상태에서 어떠한 페이지를 호출 할 것인가 적으면 적은 대로 라우터를 이동시켜 준다고 생각된다.

지우는 도구

@app.route('/delete/<int:id>/', methods=['POST'])
def delete(id):
  for topic in topics:
    if topic['id'] == id:
      topics.remove(topic)
      break;
  return redirect('/')

위에 'li'태그 중의 것을보면

<li>
	<form action="/delete/{id}/" method="POST">
  		<input type="submit" value="delete">
	</form>
</li>

라고 있는데 이것이 바로 삭제 버튼이다. type이 버튼이 아니라 submit으로써 서버에 직접 관여할 수 있게 한다.
method를 통해서 topic에 있는 것들을 삭제 할 수 있게 해준다.

DATABASE(sqlite3)

방금전까지 우리는 사용자가 직접 서버에 정보를 남길 수 있게 해줬다. 하지만 정보를 남기는 것 까지는 할 수 있지만 만약 새로고침을 한다면 남긴 정보는 저장되지 못하고 삭제되게 된다. 그래서 우리는 정보를 저장 시킬 수 있는 도구에 대해 배워보려하는 데 이것이 데이터베이스이다. sqlite3은 데이터베이스 중 하나로 데이터베이스는 종류가 되게 많다. 이 중 가장 높은 비율을 차장하는 것이 relationship database 즉 관계형 데이터베이스인데 서로 관련있는 정보끼리 모으는 데이터베이스라고 한다.

아쉽게 데이터베이스는 코드가 아닌 직접 프로그램에서 돌아가기 때문에 각 데이터베이스를 사용하고 숙달하는 것이 좋을 것 같다.

오늘의 소감

오늘부터 본격적으로 답이 안나오는 개념들과 강의시간부족으로 인해 부족한 부분들이 속속 나오기 시작했다. 특히 데이터베이스의 경우는 정말 기본적인 부분만 이용했지만 이마저도 엄청 복잡한 과정을 거치고 아직도 사용할 수 있는 기능이 많았던 것이 참 머리가 아프게 느껴졌다.

좋은 웹페이지 즐겨찾기