Python: REST API kūrimas

Žingsnis po žingsnio vadovas, kaip sukurti REST API naudojant Flask su Python

👋 Sveiki atvykę į Stackhero dokumentaciją!

Stackhero siūlo paruoštą naudoti Python cloud sprendimą, sukurtą tam, kad jūsų diegimo procesas būtų kuo paprastesnis:

  • Diekite savo aplikaciją į gamybinę aplinką per kelias sekundes su paprastu git push.
  • Naudokite savo pasirinktą domeno vardą, su automatiniu HTTPS sertifikato konfigūravimu – saugūs ryšiai bus užtikrinti automatiškai.
  • Pasikliaukite automatinėmis atsarginėmis kopijomis, atnaujinimais vienu paspaudimu ir prognozuojama kainodara, kad galėtumėte susitelkti į savo kodą, o ne infrastruktūros valdymą.
  • Naudokitės aukštu našumu ir saugumu privačioje, dedikuotoje infrastruktūroje. Jūsų aplinka yra izoliuota ir apsaugota.

Taupykite laiką ir supaprastinkite savo darbo eigą: jūsų kodas gali veikti Stackhero Python cloud hosting platformoje vos per 5 minutes.

Šiame vadove parodysime, kaip sukurti paprastą REST API naudojant Python ir Flask. Flask yra lengvas mikro-framework, leidžiantis greitai kurti žiniatinklio aplikacijas ir API.

Prieš pradėdami įsitikinkite, kad turite įdiegtus šiuos įrankius:

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

Jei reikia pagalbos aplinkos paruošimui, peržiūrėkite Development platform vadovą. Taip pat galite iš karto pradėti programuoti su internetine Code-Hero platforma. Code-Hero suteikia internetinę IDE ir terminalą su visais reikalingais įrankiais jau įdiegtais, todėl galite susitelkti į kodą, o ne į diegimą ir konfigūravimą.

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

Pradėkite sukurdami naują projekto katalogą. Šiame pavyzdyje projektas vadinasi myRestApi:

mkdir myRestApi
cd myRestApi

Nustatykite naujausią Python versiją su asdf ir inicializuokite Git repozitoriją:

asdf install python latest \
  && asdf local python latest

echo "__pycache__/" >> .gitignore

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

Šiam pavyzdžiui reikia tik vienos pagrindinės priklausomybės – Flask.

Flask sukurtas taip, kad būtų paprastas ir greitas, todėl galite kurti ir diegti žiniatinklio API be papildomų sudėtingumų. Jis turi įdiegtą maršrutizavimą, šablonų palaikymą ir HTTP užklausų apdorojimą, todėl nuo idėjos iki veikiančios API galite pereiti per kelias minutes.

Flask ir python-dotenv galite įdiegti su pip:

pip install Flask python-dotenv

Įtraukiame python-dotenv, kad patogiai ir saugiai valdytumėte aplinkos kintamuosius. Kaip jį naudoti, pamatysite vėlesniuose žingsniuose.

Po diegimo užfiksuokite priklausomybes į requirements.txt failą:

pip freeze > requirements.txt

Priklausomybių užfiksavimas užtikrina, kad visi naudos tas pačias paketų versijas. Šis mažas žingsnis gali sutaupyti daug laiko ieškant problemų ateityje.

Dabar galite rašyti savo API kodą.

Sukurkite failą app.py ir įdėkite šį kodą:

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

# Įkelti aplinkos kintamuosius iš .env ne gamybinėje aplinkoje
if os.environ.get('ENV') != 'production':
    load_dotenv()

app = Flask(__name__)

# Pavyzdiniai užduočių duomenys
tasks = [
    {
        'id': 1,
        'title': 'Buy groceries',
        'description': 'Milk, Cheese, Pizza, Fruits',
        'done': False
    },
    {
        'id': 2,
        'title': 'Learn Python',
        'description': 'Learn Python programming basics',
        'done': False
    }
]

@app.route('/api/tasks', methods=['GET'])
def get_tasks():
    return jsonify({'tasks': tasks})

@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 not task:
        return jsonify({'error': 'Task not found'}), 404
    return jsonify({'task': task[0]})

@app.route('/api/tasks', methods=['POST'])
def create_task():
    if not request.json or 'title' not in request.json:
        return jsonify({'error': 'Title is required'}), 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

if __name__ == '__main__':
    if os.environ.get('ENV') == 'production':
        app.run()
    else:
        app.run(host='0.0.0.0', port=8080, debug=True)

Serverį galite paleisti su:

python app.py

Naudojant host='0.0.0.0', jūsų API bus pasiekiama per naršyklę naudojant Code-Hero. Apsilankykite http://<XXXXXX>.stackhero-network.com:8080/api/tasks, kur <XXXXXX> pakeiskite savo Code-Hero domenu.

Kai serveris veikia, su API galite bendrauti naudodami cURL. Štai keli pavyzdiniai komandų variantai:

  • Gauti visas užduotis:

    curl -s http://localhost:8080/api/tasks
    # Output:
    # {
    #   "tasks": [
    #     ...
    #   ]
    # }
    
  • Gauti konkrečią užduotį (ID 2):

    curl -s http://localhost:8080/api/tasks/2
    # Output:
    # {
    #   "task": {
    #     ...
    #   }
    # }
    
  • Sukurti naują užduotį:

    curl -s -X POST -H "Content-Type: application/json" \
    -d '{"title": "New task", "description": "Created with cURL"}' \
    http://localhost:8080/api/tasks
    # Output:
    # {
    #   "task": {
    #     ...
    #   }
    # }
    

Patarimas: Kad rezultatas būtų aiškesnis, galite jį perduoti į jq. Pavyzdžiui, curl -s http://localhost:8080/api/tasks/2 | jq padaro JSON lengviau skaitomą.

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

Aplinkos kintamieji padeda apsaugoti slaptus duomenis, tokius kaip duomenų bazės slaptažodžiai ar API raktai. Jų naudojimas leidžia laikyti jautrią informaciją atskirai nuo kodo ir Git istorijos, taip pat lengvai keisti nustatymus skirtingose aplinkose.

Aplinkos kintamiesiems valdyti galite naudoti python-dotenv modulį. Jei praleidote ankstesnį diegimo žingsnį, įdiekite jį dabar:

pip install python-dotenv
pip freeze > requirements.txt

Sukurkite .env failą projekto šaknyje ir įrašykite savo vystymo aplinkos kintamuosius:

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

Pridėkite .env į .gitignore, kad jis nebūtų įtrauktas į Git:

echo ".env" >> .gitignore

Šiuos kintamuosius Python galite pasiekti naudodami os.environ.get():

import os

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

.env failas skirtas tik vystymui. Gamyboje ar staging aplinkoje aplinkos kintamuosius galite nustatyti tiesiogiai Stackhero valdymo pulte, Python paslaugos konfigūracijoje.

Flask vidinis serveris puikiai tinka vystymui. Gamyboje rekomenduojama naudoti patikimą WSGI serverį, pvz., Gunicorn. Štai kaip pasiruošti:

  1. Įdiekite Gunicorn:

    pip install gunicorn
    pip freeze > requirements.txt
    
  2. Paleiskite aplikaciją su Gunicorn:

    ENV=production gunicorn app:app \
      --error-logfile - \
      -b 0.0.0.0:8080
    

    Čia app:app reiškia jūsų failą (app.py) ir Flask aplikacijos instanciją (app).

  3. Galite pridėti Makefile, kad lengvai perjungtumėte vystymo ir gamybos režimus:

    .DEFAULT_GOAL := dev
    
    # Stackhero for Python pagal nutylėjimą vykdo "run" taisyklę. Perrašome ją, kad vykdytų 'prod'.
    run: prod
    
    prod:
    	ENV=production gunicorn app:app \
    	  --error-logfile - \
    	  -b 0.0.0.0:8080
    
    dev:
    	python app.py
    

Serverį galite paleisti vystymo režimu su make dev (arba tiesiog make), arba gamybos režimu su make prod.

Stackhero supaprastina ir užtikrina debesijos diegimą. Savo Python projektą galite diegti naudodami Python cloud hosting paslaugą. Funkcionalumas apima:

  • Diegimas vienu git push
  • Automatinis TLS (HTTPS) su pritaikomais domenais
  • Dedikuota infrastruktūra saugumui
  • HTTP/2, TLS 1.3, WebSockets, GZIP & Brotli, ETag ir TCP/UDP prievadų palaikymas

Diegimui atlikite šiuos žingsnius:

  1. Gaukite savo viešą SSH raktą:

    cat ~/.ssh/id_*.pub
    
  2. Stackhero valdymo pulte atidarykite savo "Stackhero for Python" paslaugą ir pasirinkite "Configure".

  3. Įklijuokite viešą raktą į "SSH public keys" arba "Key" lauką.

  4. Spauskite "Validate", kad patvirtintumėte konfigūraciją.

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

Jei dar neturite SSH raktų, galite juos sugeneruoti su:

ssh-keygen -t ed25519

Pridėkite Git nuotolinį adresą prie projekto naudodami komandą iš Stackhero paslaugos (pakeiskite <XXXXXX> savo paslaugos domenu):

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

Git remote komandaGit remote komanda

Kai būsite pasiruošę diegti, išsiųskite kodą su:

git push stackhero main

Prieš diegdami nepamirškite įrašyti pakeitimų (commit). Stackhero Code-Hero aplinkoje galite naudoti Command Palette (Ctrl+Shift+P arba Cmd+Shift+P) ir įvesti Git: Commit greitam commit'ui.

Po diegimo jūsų API bus pasiekiama adresu https://<XXXXXX>.stackhero-network.com/api/tasks. Pakeiskite <XXXXXX> savo paslaugos domenu, kad pasiektumėte Flask API.

Dabar turite veikiančią REST API, sukurtą su Flask. Turėdami šį pagrindą, lengvai galite plėsti aplikaciją, prijungti duomenų bazes ar integruoti su kitomis paslaugomis. Flask suteikia lankstumą augti nuo paprasto prototipo iki pilnai veikiančios gamybinės API.