Kreado de Joke API

Skip to content

Ĉi tio estas maŝine tradukita teksto kiu povas enhavi erarojn!

Ni jam vidis iom pri Flask, sed, kiel ripeto: kio fakte estas Flask? Ĝi estas ret-servilo. Do, uzanto povas peti informojn de la servilo, kaj la uzanto ricevas respondon reen. Sed kio ĉi tio fakte estas en praktiko?

Kio estas API?

API (Application Programming Interface) estas maniero por programoj komuniki inter si. Programo povas peti informojn de alia programo, kaj la programo ricevas respondon reen.

Ĉu ĉi tio ne estis sufiĉe simila al la Ret-Servero, kiun ni vidis en Flask? Ĝi estas! Kion ni kreis en Flask, ni fakte povas nomi API.

En ĉi tiu projekto ni havos ĉi tiun dosierstrukturon:

Filstrukturo

📁Flask_API
    📁static
    📁templates
        📄index.html
    🐍app.py
    📄jokes.json
    📄requirements.txt

Startkode (Click to expand)

Tiu ĉi kodon vi povas elŝuti el la GitHub-deponejo. Eble vi povas memstare starigi la projekton kaj “kopii/glui” la kodon.

requirements.txt
flask
requests
jokes.json
{
   "jokes": [
        {
            "value": "Why did the chicken cross the road? Buck if i know!"
        },
        {
            "value": "Two tomatoes crossed the road, then one of them said, come on, ketchup!"
        }
    ]
}
app.py
from flask import Flask, jsonify, request, render_template
import json
import requests
import random

app = Flask(__name__)

JOKE_FILE = "jokes.json"

@app.route("/")
def index():
    return render_template("index.html", joke="")

if __name__ == '__main__':
    app.run(debug=True)
index.html
<h1>Joke API!</h1>

<form method="GET" action="/get-joke">
    <textarea id="the_joke" name="the_joke" rows="10" cols="50" readonly>{{ joke.value }}</textarea><br>
    <input type="submit" value="Get Joke">
</form>

<form method="POST" action="/add-joke">
    <label for="joke_text">Joke:</label><br>
    <textarea id="joke_text" name="joke_text" rows="10" cols="50" required></textarea><br>
    <input type="submit" value="Add Joke">
</form>

Mallonga klarigo

  • app.py
    • La ĉefprogramo estas ĉi tie.
  • requirements.txt
    • Ĉi tiu dosiero enhavas la nomon de ĉiuj pakaĵoj kiuj necesas por ke la programo funkciu.
    • Bonvolu uzi tiujn kiam vi laboras kune pri grandaj projektoj, ĝi povas esti multaj pakaĵoj post iom da tempo!
  • jokes.json
    • Ĉi tiu dosiero devas teni la informojn pri la ŝercoj.
  • index.html
    • Dosiero de ŝablono por montri la paĝon

Del 1 - Kreado de la programo

La programo postulas kelkajn pakojn por funkcii. Ni povus instali ĉiujn mane, sed la plej granda parto de grandaj python-projektoj, kiujn vi vidos, venos kun dosiero requirements.txt. Ĉi tiu dosiero enhavas ĉion, kion programo bezonas por funkcii.

Easy Tasko 1.1a - Instali Pakojn

Malfermu terminalon kaj skribu la komandon:
pip install -r .\requirements.txt

Tio aŭtomate (🧙‍♂️) instalos ĉiujn pakojn kiuj estas menciitaj tie.

Easy Tasko 1.1b - Testu la kodon

Kuru la python-dosieron app.py por vidi ĉu vi instalis la pakojn ĝuste.

Kion faras la kodo?
# importu aĵojn kiujn ni bezonas
from flask import Flask, jsonify, request, render_template
import json
import requests
import random

# krei servilon
app = Flask(__name__)

# dosiero kiu tenas spuron de la ŝercoj
JOKE_FILE = "jokes.json"

@app.route("/")
def index():
    # ĉi tie 'render_template' sendos 'ŝercon' reen al la uzanto
    return render_template("index.html", joke="")

# ruligu la servilon en senbuga modo
if __name__ == '__main__':
    app.run(debug=True)

Medium Tasko 1.2a - Ne mokas pri tio

Aldonu funkciecon por elpreni hazardan ŝercon el la .json dosiero. Kreu vojon nomitan /get-joke. Legu pri JSON en Python ĉi tie: w3schools JSON.

Ĉi tie vi ankaŭ devas rigardi kiel legi dosieron en Python, jen maniero rigardi tion: GeeksForGeeks read file.

Løsning
@app.route("/get-joke", methods=["GET"])
def joke():
    with open(JOKE_FILE, "r") as f:
        jokes = json.loads(f.read())

    joke = random.choice(jokes["jokes"])

    return render_template("index.html", joke=joke)

Bonusspørsmål (nur pensu)
  • Kio okazas nun se vi premas la butonon “Get Joke”?
  • Kion faras la linio kun random.choice?
  • Kial estas saĝe uzi ["jokes"] ĉe la fino de la linio?

Easy Ekzerco 1.2b - Pli da ŝercetoj

Aldonu kelkajn pliajn ŝercetojn al jokes.json mane, reekzekutu la kodon, kaj rigardu kio okazas.

Hva gjør koden i index.html?

La kodo estas plejparte tute kutima HTML-kodo. Sed estas kelkaj tags (tio inter < kaj >) kiujn vi eble ne vidis antaŭe.

Ĉi tie estas uzata form. Form estas efektive io, kiun uzanto povas influi, kontroli. Ni vidas, ke estas du tagoj ene de la form. textarea estas areo kun teksto, en kiun uzanto povas skribi. Ĉi tie estas skribita readonly en ĝi, kio signifas, ke ĝi ne povas esti skribita de uzanto, sed retejo tamen povas skribi ion al ĝi, kion ni faras kun render_template en python.

Vi eble rimarkas, ke en ĉi tiu form estas skribita {{ joke.value }}. Tio ne estas HTML, sed io, kiun oni nomas Jinja. Tio estas tio, kiun oni nomas “templangvo”. Do, “receptolingvo”. Tio donas do recepton pri kiel retejo povas esti konstruita.

Del 2 - Uzante Eksteran API-on en Flask

Ĉar API estas maniero por programoj komuniki inter si, ni povas skribi kodon en programo kiu alprenas informojn de alia. Ĉi tio estas unu el la ĉefaj uzokazoj de API-oj.

Ĉi tie ni rigardos simplan API-on por alpreni Chuck Norris ŝercetojn.

Ĉi tie estas iom da informo pri kiel ni povas uzi la API-on:

GET https://api.chucknorris.io/jokes/random
# Henter en tilfeldig vits fra Chuck Norris API-et.
# Alprenas aleatorian ŝton el la Chuck Norris API.

Tio signifas, ke ni devas uzi GET-peton kun la donita URL por ricevi la informojn. Vi eble rimarkis, ke estas methods=["GET"] en la itinero de Tasko 1.3. Tio signifas, ke ni devas ricevi informojn. Se vi volus sendi informojn, vi devus uzi petometodon nomatan POST. Sed ni nur rigardos GET nun.

Medium Tasko 2.1 - Chuckity Chuck

Kreu novan vojon nomatan chuck kaj poste uzu la paketon requests por ricevi respondon. Konservu la respondvaloron en variablo kiun vi nomas response.

Vi povas legi pri kiel uzi ĉi tiun paketon ĉi tie: Requests Quickstart

Kion ni ricevas reen en la variablo response estas teksto (eĉ se ĝi ŝajnas esti json), do ni devas konverti la tekston al json skribante joke = response.json().

Fine, vi povas redoni render_template kun la ŝerco. (Simile al ĉe @app.route("/"))!

Løsningen
@app.route("/chuck", methods=["GET"])
def chuck():
    response = requests.get("https://api.chucknorris.io/jokes/random")
    joke = response.json()

    return render_template("index.html", joke=joke)

Easy Tasko 2.2 - Ekzekutu!

Uzu http://127.0.0.1:5000/chuck en la navigilo nun, kio okazas?