Python: REST API kūrimas

Kaip sukurti REST API naudojant Flask

👋 Sveiki atvykę į Stackhero dokumentaciją!

Stackhero siūlo paruoštą naudoti Python cloud sprendimą, kuris suteikia daugybę privalumų, įskaitant:

  • Įdiekite savo programą per kelias sekundes su paprastu git push.
  • Naudokite savo domeno vardą ir pasinaudokite automatinės HTTPS sertifikatų konfigūracijos privalumais, kad padidintumėte saugumą.
  • Mėgaukitės ramybe su automatinėmis atsarginėmis kopijomis, vieno paspaudimo atnaujinimais ir paprasta, skaidria bei prognozuojama kainodara.
  • Gaukite optimalią veikimo ir tvirtą saugumo lygį dėka privačios ir dedikuotos VM.

Taupykite laiką ir supaprastinkite savo gyvenimą: išbandyti Stackhero Python cloud hosting sprendimą užtrunka tik 5 minutes!

Ši dokumentacija yra pradedantiesiems skirtas vadovas, kaip sukurti REST API naudojant Python.

Šiame pavyzdyje naudojame Flask, lengvą ir paprastą mikrostruktūrą, leidžiančią greitai kurti internetines programas.

Prieš pradėdami, įsitikinkite, kad jūsų kompiuteryje yra šie įrankiai:

  1. Python
  2. pip
  3. git
  4. asdf

Jei jūsų kūrimo aplinka dar nėra nustatyta, žr. Development platform vadovą, kuriame pateikiamos išsamios instrukcijos. Arba galite naudoti internetinę platformą Code-Hero. Code-Hero suteikia internetinę IDE ir terminalą su visais būtinais įrankiais, kad galėtumėte pradėti programuoti iš karto be jokios diegimo.

Python REST API veikia Code-Hero, pasiekiama tiesiogiai iš naršyklėsPython REST API veikia Code-Hero, pasiekiama tiesiogiai iš naršyklės

Pirmas žingsnis yra sukurti naują projekto katalogą. Šiam vadovui pavadinsime jį myRestApi:

mkdir myRestApi
cd myRestApi

Tada nustatykite Python versiją į naujausią, naudodami asdf, ir inicijuokite Git saugyklą:

asdf install python latest \
  && asdf local python latest

echo "__pycache__/" >> .gitignore

git init
git add -A .
git commit -m "First commit"

Šiam pavyzdžiui mums reikia tik vienos priklausomybės: Flask.

Flask yra lengvas interneto struktūra, leidžianti greitai kurti internetines programas. Jis sukurtas taip, kad būtų paprastas ir lengvai naudojamas, leidžiantis kūrėjams greitai kurti ir diegti interneto paslaugas. Integruotas maršrutų, šablonų ir HTTP užklausų tvarkymas daro Flask puikiu pasirinkimu kuriant REST API.

Įdiekite Flask (ir python-dotenv) naudodami pip:

pip install Flask python-dotenv

Čia diegiame Flask ir python-dotenv modulius. Netrukus pamatysite, kodėl naudojame python-dotenv (spoileris: tai skirta aplinkos kintamųjų valdymui).

Po diegimo užfiksuokite paketų versijas į requirements.txt failą:

pip freeze > requirements.txt

Užfiksavus priklausomybes, užtikrinama, kad jūsų gamybos serveris ar kolegos naudotų tas pačias versijas kaip ir jūs. Kelios sekundės darbo gali išvengti daugelio būsimų galvos skausmų.

Dabar pasinerkime į kodą!

Sukurkite failą pavadinimu app.py ir įterpkite šį kodą:

import os
from dotenv import load_dotenv
from flask import Flask, jsonify, request

# Įkelti aplinkos kintamuosius iš .env failo, kai nesame gamyboje
if os.environ.get('ENV') != 'production':
    load_dotenv()

# Sukurti Flask programą
app = Flask(__name__)

# Pavyzdžių duomenų rinkinys
tasks = [
    {
        'id': 1,
        'title': 'Pirkti maisto produktus',
        'description': 'Pienas, Sūris, Pica, Vaisiai',
        'done': False
    },
    {
        'id': 2,
        'title': 'Išmokti Python',
        'description': 'Išmokti Python programavimo pagrindus',
        'done': False
    }
]

# Maršrutas '/api/tasks' (GET) norint išvardyti visas užduotis
@app.route('/api/tasks', methods=['GET'])
def get_tasks():
    return jsonify({'tasks': tasks})

# Maršrutas '/api/tasks/<task_id>' (GET) norint gauti konkrečią užduotį pagal ID
@app.route('/api/tasks/<int:task_id>', methods=['GET'])
def get_task(task_id):
    task = [task for task in tasks if task['id'] == task_id]
    if len(task) == 0:
        return jsonify({'error': 'Užduotis nerasta'}), 404
    return jsonify({'task': task[0]})

# Maršrutas '/api/tasks' (POST) norint sukurti naują užduotį
@app.route('/api/tasks', methods=['POST'])
def create_task():
    if not request.json or 'title' not in request.json:
        return jsonify({'error': 'Pavadinimas yra būtinas'}), 400
    task = {
        'id': tasks[-1]['id'] + 1,
        'title': request.json['title'],
        'description': request.json.get('description', ""),
        'done': False
    }
    tasks.append(task)
    return jsonify({'task': task}), 201

# Pradėti API serverį
if __name__ == '__main__':
    if os.environ.get('ENV') == 'production':
        app.run()
    else:
        app.run(host='0.0.0.0', port=8080, debug=True)

Norėdami paleisti serverį, vykdykite:

python app.py

Su host='0.0.0.0' parinktimi, galite taip pat pasiekti savo API naudodami naršyklę, kai naudojate Code-Hero. Tiesiog naršykite į http://<XXXXXX>.stackhero-network.com:8080/api/tasks, pakeisdami <XXXXXX> savo Code-Hero domenu.

Kai serveris veikia, galite su juo sąveikauti naudodami cURL. Štai keletas pavyzdžių:

  • Gauti visas užduotis:

    curl -s http://localhost:8080/api/tasks
    {
      "tasks": [
        {
          "description": "Pienas, Sūris, Pica, Vaisiai",
          "done": false,
          "id": 1,
          "title": "Pirkti maisto produktus"
        },
        {
          "description": "Išmokti Python programavimo pagrindus",
          "done": false,
          "id": 2,
          "title": "Išmokti Python"
        }
      ]
    }
    
  • Gauti užduotį su ID 2:

    curl -s http://localhost:8080/api/tasks/2
    {
      "task": {
        "description": "Išmokti Python programavimo pagrindus",
        "done": false,
        "id": 2,
        "title": "Išmokti Python"
      }
    }
    
  • Sukurti naują užduotį:

    curl -s -X POST -H "Content-Type: application/json" \
    -d '{"title": "Nauja užduotis", "description": "Sukurta su cURL"}' \
    http://localhost:8080/api/tasks
    {
      "task": {
        "description": "Sukurta su cURL",
        "done": false,
        "id": 3,
        "title": "Nauja užduotis"
      }
    }
    

Patarimas: Nukreipkite išvestį į jq, kad JSON būtų gražesnis. Pavyzdžiui, curl -s http://localhost:8080/api/tasks/2 | jq sukuria labiau skaitomą rezultatą.

Python REST API pavyzdys naudojant Flask, veikiantis Stackhero Code-Hero, su serveriu (1) ir klientu naudojant cURL (2)Python REST API pavyzdys naudojant Flask, veikiantis Stackhero Code-Hero, su serveriu (1) ir klientu naudojant cURL (2)

Aplinkos kintamieji yra svarbūs apsaugant jautrią informaciją, tokią kaip duomenų bazės prisijungimo duomenys ar API raktai. Yra du pagrindiniai privalumai naudojant aplinkos kintamuosius:

  1. Jūsų paslaptys nėra saugomos jūsų Git saugykloje, užtikrinant, kad neįgalioti asmenys negali pasiekti jūsų jautrių duomenų, net jei jie gauna prieigą prie jūsų šaltinio kodo.
  2. Galite naudoti skirtingus prisijungimo duomenis skirtingoms aplinkoms (pvz., gamyba prieš kūrimą).

Norėdami valdyti aplinkos kintamuosius, naudojame python-dotenv modulį. Pirmiausia, įdiekite jį, jei dar to nepadarėte:

pip install python-dotenv
pip freeze > requirements.txt

Tada sukurkite .env failą savo projekto šaknyje ir pridėkite savo kūrimo aplinkos kintamuosius. Pavyzdžiui:

ENV="development"
DATABASE_PASSWORD="secretPassword"
THIRD_API_PRIVATE_KEY="secretKey"

Galiausiai, pridėkite .env failą į savo .gitignore, kad išlaikytumėte saugumą:

echo ".env" >> .gitignore

Norėdami pasiekti šiuos aplinkos kintamuosius Python, tiesiog naudokite os.environ.get():

import os

print(os.environ.get('ENV'))

.env failas naudojamas tik kūrimo aplinkai. Dėl testavimo ar gamybos, nustatykite aplinkos kintamuosius Stackhero prietaisų skydelyje jūsų Python paslaugos konfigūracijoje.

Nors šiame vadove naudojamas Flask integruotas kūrimo serveris, gamybai būtina naudoti gamybai paruoštą WSGI serverį, pvz., Gunicorn. Vykdykite šiuos veiksmus:

  1. Įdiekite Gunicorn:

    pip install gunicorn
    pip freeze > requirements.txt
    
  2. Paleiskite savo programą naudodami Gunicorn su app:app argumentu (kur pirmasis app yra failo pavadinimas, o antrasis app yra Flask instancija):

    ENV=production gunicorn app:app \
      --error-logfile - \
      -b 0.0.0.0:8080
    
  3. Sukurkite Makefile, kad supaprastintumėte perjungimą tarp kūrimo ir gamybos režimų:

    .DEFAULT_GOAL := dev
    
    # Pagal numatytuosius nustatymus, Stackhero Python vykdo "run" taisyklę. Mes ją pakeičiame, kad vykdytume 'prod' taisyklę.
    run: prod
    
    prod:
     	ENV=production gunicorn app:app \
     	  --error-logfile - \
     	  -b 0.0.0.0:8080
    
    dev:
     	python app.py
    

Galite paleisti savo serverį kūrimo režimu naudodami make dev (arba tiesiog make), o gamybos režimu naudodami make prod.

Paprasčiausias būdas diegti savo Python projektą yra naudoti Stackhero Python debesų prieglobos paslaugą. Pagrindinės funkcijos apima:

  • Diegimas su paprastu git push
  • Pritaikomas domenas su automatiniu TLS sertifikatų valdymu (HTTPS)
  • Veikia privačioje ir dedikuotoje VM, užtikrinant maksimalų saugumą
  • Palaiko HTTP/2, TLS 1.3 (HTTPS), WebSockets, GZIP & Brotli suspaudimą, ETag ir TCP/UDP prievadų prieigą

Norėdami diegti savo kodą į Stackhero, vykdykite šiuos veiksmus:

  1. Gaukite savo viešąjį raktą naudodami:

    cat ~/.ssh/id_*.pub
    
  2. Stackhero prietaisų skydelyje eikite į savo "Stackhero for Python" paslaugą ir spustelėkite mygtuką "Konfigūruoti".

  3. Nukopijuokite viešąjį raktą iš pirmojo žingsnio ir įklijuokite jį į "SSH public keys" arba "Key" lauką.

  4. Patvirtinkite konfigūraciją spustelėdami mygtuką "Patvirtinti" puslapio apačioje.

"Stackhero for Python" viešojo rakto konfigūracija"Stackhero for Python" viešojo rakto konfigūracija

Neturite SSH raktų? Sukurkite juos vykdydami:

ssh-keygen -t ed25519

Galiausiai, sukonfigūruokite savo saugyklą, kad diegtumėte į Stackhero. Savo projekto aplanke pridėkite Git nuotolinį naudodami komandą, pateiktą jūsų Stackhero paslaugoje (pakeiskite <XXXXXX> savo paslaugos domenu):

git remote add stackhero ssh://stackhero@<XXXXXX>.stackhero-network.com:222/project.git

Git nuotolinė komandaGit nuotolinė komanda

Kai viskas sukonfigūruota, diegkite savo kodą gamyboje su viena komanda:

git push stackhero main

Įsitikinkite, kad pridėjote ir patvirtinote savo pakeitimus prieš stumdami savo kodą į gamybą. Stackhero Code-Hero galite greitai patvirtinti pakeitimus naudodami Command Palette (paspauskite Ctrl+Shift+P Windows/Linux arba Cmd+Shift+P macOS ir įveskite Git: Commit).

Po diegimo apsilankykite savo API URL adresu https://<XXXXXX>.stackhero-network.com/api/tasks (pakeiskite <XXXXXX> savo paslaugos domenu), kad pamatytumėte savo Flask API veikimą.

Sekdami šį vadovą, dabar suprantate, kaip sukurti REST API naudojant Flask. Su šia žiniomis galite pasitikėti savimi kurdami ir plėsdami savo RESTful programas, integruodami jas su įvairiomis front-end ir back-end paslaugomis.