Waffleweb으로 기본 API를 만드는 방법

이 자습서에서는 토론 주제를 제공하는 API를 생성합니다. Waffleweb으로 API를 구축할 것입니다.

Waffleweb을 모르는 사람들을 위해 Python 웹 프레임워크입니다. 가볍고 사용자 정의가 가능합니다. https://github.com/Berserkware/waffleweb에서 Waffleweb을 찾을 수 있습니다.

전제 조건



API를 생성하려면 Python과 Waffleweb이 설치되어 있어야 합니다. 사용 가능한 Python 설치 방법에 대한 많은 자습서가 있으므로 Waffleweb 설치 방법만 표시됩니다.

와플웹 설치



pip을 사용하면 Waffleweb을 쉽게 설치할 수 있습니다.

pip install waffleweb


프로젝트 설정



프로젝트를 설정하려면 main.py 파일을 생성하기만 하면 됩니다. main.py 파일은 모든 경로가 있는 파일입니다. 또한 웹 서버를 실행합니다. 지금은 코드를 따라야 합니다.
main.py:
from waffleweb import app

#Runs the built-in webserver.
if __name__ == '__main__':
    app.run()


기본 페이지 만들기



기본 페이지는 사용자에게 API의 기능과 사용 방법을 교육합니다. 기본 페이지 만들기를 시작하려면 먼저 몇 가지 템플릿을 만들어야 합니다.

필요한 파일 만들기



"templates"라는 폴더를 만들고 그 안에 "index.html"과 "usage.html"이라는 두 개의 파일을 넣어 시작하겠습니다. 이 파일에 일부 데이터를 넣을 것입니다. 이 페이지는 매우 기본적이므로 원하는 대로 사용자 정의할 수 있습니다.
templates/index.html:
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Debate API</title>
</head>
<body>
    <h1>Welcome to the Debate API!</h1>

    <h2>Usage: <a href="/usage">Usage</a></h2>

    <h3>Debate of the Day:</h3>
    <h2>{{ debateOfTheDay }}</h2>
</body>
</html>

templates/usage.html:
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Debate API Usage</title>
</head>
<body>
    <h1>Debate API Usage</h1>
    <h2>/api/random</h2>
    <p>Gets a random debate topic.<br>Returns:</p>
    <code>
        {"topic": "[Insert Topic Here]", "id": id}
    </code>

    <h2>/api/{id}</h2>
    <p>Gets a debate topic by ID.<br>Returns:</p>
    <code>
        {"topic": "[Insert Topic Here]", "id": id}
    </code>

    <h2>/api/debate-of-the-day</h2>
    <p>Gets the debate topic of the day.<br>Returns:</p>
    <code>
        {"topic": "[Insert Topic Here]", "id": id}
    </code>
</body>
</html>


또한 "data"라는 폴더를 만들고 "data.json"이라는 파일을 추가해야 합니다. 또한 일부 상용구 데이터로 채워야 합니다. 우리는 또한 몇 가지 토론 질문을 추가할 것입니다. DebateOfTheDay는 오늘의 토론의 지표가 되어야 합니다.
data/data.json:
{
    "topics": [
        "Nuclear energy is the best energy.",
        "Python is the best programming language.",
        "Social media is unhealthy.",
        "Apples are the best fruit."
    ],
    "debateOfTheDay": 0
}


기능 라우팅



이제 페이지를 반환하도록 함수를 라우팅해야 합니다. route 데코레이터를 사용하면 쉽게 할 수 있습니다. 인덱스 페이지에는 오늘의 토론을 검색하기 위한 몇 가지 추가 논리가 있습니다.
main.py:
from waffleweb import app
from waffleweb.response import render
import json    

@app.route('/')
def index(request):
    with open('data/data.json', 'r') as f:
        #Gets the data and loads it into a dictionary
        data = json.loads(f.read())
        #This gets the id of the debate of the day then finds the matching topic
        debateOfTheDay = data['topics'][data['debateOfTheDay']]

    return render(request, 'index.html', {'debateOfTheDay': debateOfTheDay})

@app.route('/usage')
def usage(request):
    return render(request, 'usage.html')

#Runs the built-in webserver.
if __name__ == '__main__':
    app.run()

route 데코레이터의 유일한 인수는 해당 페이지에 액세스하기 위한 URL입니다. render 함수는 템플릿을 반환합니다.

이제 "main.py"파일을 실행하여 페이지를 테스트할 수 있습니다.

API 생성



사이트의 API 섹션을 생성하려면 일부 기능을 라우팅하기만 하면 됩니다. 임의의 주제에 대한 페이지, 오늘의 토론에 대한 페이지, ID로 주제를 가져오는 페이지 등 세 페이지를 라우팅할 것입니다.

기능 라우팅



함수를 라우팅하기 위해 다시 route 데코레이터를 사용합니다.
main.py:
from waffleweb import app
from waffleweb.response import render, JSONResponse
import json
import random

@app.route('/')
def index(request):
    with open('data/data.json', 'r') as f:
        #Gets the data and loads it into a dictionary
        data = json.loads(f.read())
        #This gets the id of the debate of the day then finds the matching topic
        debateOfTheDay = data['topics'][data['debateOfTheDay']]

    return render(request, 'index.html', {'debateOfTheDay': debateOfTheDay})

@app.route('/usage')
def usage(request):
    return render(request, 'usage.html')

@app.route('api/random')
def randomTopic(request):
    with open('data/data.json', 'r') as f:
        #Gets the data and loads it into a dictionary
        data = json.loads(f.read())

        topics = data["topics"]
        randomTopicID = random.randint(0, len(topics))

    return JSONResponse(request, {"topic": topics[randomTopicID], "id": randomTopicID})

@app.route('api/debate-of-the-day')
def debateOfTheDay(request):
    with open('data/data.json', 'r') as f:
        #Gets the data and loads it into a dictionary
        data = json.loads(f.read())

        #This gets the id of the debate of the day then finds the matching topic
        debateOfTheDayID = data['debateOfTheDay']
        debateOfTheDay = data['topics'][debateOfTheDayID]

    return JSONResponse(request, {"topic": debateOfTheDay, "id": debateOfTheDayID})

@app.route('api/<id:int>')
def getTopicByID(request, id):
    with open('data/data.json', 'r') as f:
        #Gets the data and loads it into a dictionary
        data = json.loads(f.read())

        topics = data["topics"]

    if type(id) != int:
        return JSONResponse(request, {"error": "The ID has to be an int."})

    if id < 0 or id >= len(topics):
        return JSONResponse(request, {"error": "A topic with that id does not exist."})

    return JSONResponse(request, {"topic": data["topics"][id], "id": id})

#Runs the built-in webserver.
if __name__ == '__main__':
    app.run()


ID로 주제를 가져오는 경로에서 "<id:int> "라는 이상한 텍스트를 발견할 수 있습니다. URL에 변수 부분을 포함할 수 있는 URL 변수입니다. 그런 다음 함수 인수로 변수에 액세스할 수 있습니다.
JSONResponse는 JSON 전용 응답입니다.

결론



이 튜토리얼을 읽어주셔서 감사합니다! 이 튜토리얼을 따라 성공하셨기를 바랍니다. 피드백은 대단히 감사합니다!

좋은 웹페이지 즐겨찾기