1 분 소요

쓰기

  • name: 서버로 전송되는 내용에 대한 이름
  • form: 사용자가 입력한 정보를 서버로 전송하는 url
  • get 방식: url 을 통해서 서버로 정보를 전달하는 방식
  • post 방식(form 태그 내에서 method로 변경 가능): url에 변화가 없다. f12 -> Network -> Payload에서 정보를 확인할 수 있다.
  • 라우트의 경우는 일반적으로 GET 방식만 허용 -> Method Not Allowed 에러 뜸 -> methods 라는 속성 사용
from flask import Flask, request, redirect
import random

app = Flask(__name__)

# 데이터 베이스에 넣는 정보라고 생각하면 됨
nextID = 4
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}
            <li><a href="/create/">create</a></li>
        </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/', methods=['GET', 'POST'])
def create():
    if request.method == 'GET':  # 이거를 통해서 사용자가 결정한 메소드를 알 수 있다.
        content = '''
            <form action="/create/" method="POST">
                <p><input type="text" placeholder="title" name="title"></p>
                <p><textarea placeholder="body" name="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 = f'/read/{nextID}/'
        nextID += 1
        return redirect(url)

# 가변 라우팅 받기


@app.route('/read/<int:id>/')
def read(id):  # 여기로 전달되는 인자는 int로 전달
    title = ''
    body = ''
    for topic in topics:
        if id == topic['id']:
            title = topic['title']
            body = topic['body']
            break
    print(title, body)
    return template(getContents(), f'<h2>{title}</h2>{body}')


app.run(debug=True)

태그:

카테고리:

업데이트:

댓글남기기