ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [FLASK] 쓰기(Create)_2
    FLASK 2022. 11. 12. 21:29

     

     

     

    현재 코드▼

    from flask import Flask
    
    
    app = Flask(__name__)
    
    
    topics = [
        {'id':1, 'title': 'html', 'body': 'html is ...'},
        {'id':2, 'title': 'css', 'body': 'css is ...'},
        {'id':3, 'title': 'javascript', 'body': 'javascript is ...'}
    ]
    
    def template(contents, content):
        return f'''<!doctype html>
        <html>
            <body>
                <h1><a href="/">WEB</a></h1>
                </ol>
                    {contents}
                </ol>
                {content}
                <ul>
                    <li><a href="/create/">create</a></li>
                </ul>
            </body>
        </html>
        '''
    
    def getContents():
        liTags = ''
        for topic in topics:
            liTags = liTags + f'<li><a href="/read/{topic["id"]}/">{topic["title"]}</a></li>'
        return liTags
    
    
    @app.route('/')
    def index():
        return template(getContents(), '<h2>Welcome</h2>Hello, WEB')
    
    
    @app.route('/create/')
    def create():
        content = '''
            <form action="/create/" 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(getContents(), content)
    
    
    @app.route('/read/<int:id>/')
    def read(id):
        title = ''
        body = ''
        for topic in topics:
            if id  == topic['id']:
                title = topic['title']
                body = topic['body']
                break
        return template(getContents(), f'<h2>{title}</h2>{body}')
    
    app.run(debug=True)

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     서버로 데이터를 전송했더니

    'Method Not Allowed'라는 에러가 보입니다.

     

    우리가 url을 직접 치거나 링크를 통해서 들어가는 것은

    GET방식으로 create 페이지로 이동하는 것입니다.

    라우트에 특별한 처리를 하지 않으면

    이 라우트는 GET방식만 받습니다.

     

    그렇다면 우리가 원하는 POST방식을 받고 싶을때에는 어떻게 해야 할까요?

    Flask 공식문서를 살펴보도록 하겠습니다!

     

     

     

     

     

     

     

     

     

     

     

     

    HTTP Methods 부분을 살펴보겠습니다.

    http는 웹브라우저와 웹서버가 통신하는 통신규약으로

    GET, POST, 등등의

    규약에서 데이터를 주고 받는 방식이 있습니다.

     

    서버쪽으로 전송된 데이터가

    GET이 아닌 POST로

    라우트가 허용하게 하려면 methods를 지정해야 합니다.

     

     

     

     

     

     

     

     

     

     

     

     

     

     

    methods를 추가하고 확인해 보겠습니다.

     

     

     

    에러는 발생하지 않지만

    똑같은 입력화면이 뜹니다..!

     

    우리가 원하는 것은

    사용자가 GET방식으로 들어오면 입력 화면을

    POST방식으로 데이터를 전송하면 데이터를 추가하도록 하는것입니다.

     

    이 때 공식 문서처럼 request를 사용하면 됩니다.

    request(요청)은웹브라우저가 웹서버한테 전송한 여러가지 정보, 상태를 말합니다.

     

     

     

     

     

     

     

     

     

     

     

     

     

     

    request를 import해주고

    if문을 이용하여

    request.method가 GET일 경우에는 입력화면을

    POST일 경우에는 'Hello POST'라는 문구가 출력되도록하여 테스트 해 보겠습니다.

     

     

     

    문구가 잘 출력되는 것을 확인할 수 있습니다!

     

    이제 'Hello Post'가 아닌

    사용자가 입력한 데이터를

    어떻게 가져올 수 있을지 문서를 보도록 하겠습니다!

     

     

     

     

     

     

     

     

     

     

     

     

     

    문서를 내리다보면 The Request Object라는 부분이 나옵니다.

    문서를 살펴보면 request.form을 이용해서POST방식으로 전송한 데이터를 가져올 수 있다는 것을 알 수 있습니다!

     

     

     

     

     

     

     

     

     

     

     

     

     

     

    request.form을 이용해

    사용자가 입력한 title과 body를 가져옵니다.

     

    newTopic이라는 새로운 딕셔너리를 생성하고

    기존 topics에 추가합니다.

     

    여기서 id값은 글을 생성할때마다 1씩 늘어나야 합니다!

     

    먼저 nextId라는 변수를 생성하고

    현재 있는 topics가 3번까지 있으므로

    nextId의 초기값은 4로 지정하였습니다.

     

    nextId는 전역변수로

    바꿀 때에는 변수가 사용되기 이전의 코드에서

    global로 지정해 줍니다.

     

    글의 생성이 끝난 후에는

    생상한 글의 url로(read) 이동 하도록 path를 입력해 줍니다.

     

     

     

     

    문서를 좀 더 내리다 보면

    Redirects and Errors라는 부분이 나옵니다.

     

    redirect()함수는

    사용자의 웹브라우저한테 어디어디로 이동하라고

    명령을 내리는 함수입니다.

     

    redirect를 import해준 후

    return값으로 읽기 모드의 path를(url) 넣어주면 완성입니다!

     

     

     

     

     

     

     

     

     

     

     

     

     

     

    제목과 본문을 입력하고 create를 눌러주면 ~

     

     

     

     

     

     

     

    글이 생성되고 read페이지로 이동했습니다!

     

     

     

     

     

     

     

     

     

    쓰기(create)  완성!

    @app.route('/create/', methods=['GET', 'POST'])
    def create():
        if request.method == 'GET':
            content = '''
                <form action="/create/" 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(getContents(), content)
        elif request.method == 'POST':
            global nextId
            title = request.form['title']
            body = request.form['body']
            newTopic = {'id': nextId, 'title': title, 'body': body}
            topics.append(newTopic)
            url = '/read/'+str(nextId)+'/'
            nextId = nextId + 1
            return redirect(url)

     

     

     

     

     

     

     

     

    출처

    Flask web framework - 7.2. 쓰기

    'FLASK' 카테고리의 다른 글

    [FLASK] 삭제(Delete)  (0) 2022.11.14
    [FLASK] 수정(Update)  (0) 2022.11.13
    [FLASK] 쓰기(Create)_1  (0) 2022.11.12
    [FLASK] 읽기(Read)  (0) 2022.11.11
    [FLASK] 홈페이지 구현  (0) 2022.11.11
Designed by Tistory.