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.
Reikalavimai
Prieš pradėdami, įsitikinkite, kad jūsų kompiuteryje yra šie įrankiai:
- Python
- pip
- git
- 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ės
Naujo projekto kūrimas
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"
Flask priklausomybės diegimas
Š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
Flaskirpython-dotenvmodulius. Netrukus pamatysite, kodėl naudojamepython-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ų.
REST API įgyvendinimas naudojant Flask
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.
Jūsų REST API testavimas
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 | jqsukuria labiau skaitomą rezultatą.
Python REST API pavyzdys naudojant Flask, veikiantis Stackhero Code-Hero, su serveriu (1) ir klientu naudojant cURL (2)
Aplinkos kintamųjų valdymas
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:
- 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.
- 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'))
.envfailas naudojamas tik kūrimo aplinkai. Dėl testavimo ar gamybos, nustatykite aplinkos kintamuosius Stackhero prietaisų skydelyje jūsų Python paslaugos konfigūracijoje.
Python ir Flask paruošimas gamybos diegimui
Nors šiame vadove naudojamas Flask integruotas kūrimo serveris, gamybai būtina naudoti gamybai paruoštą WSGI serverį, pvz., Gunicorn. Vykdykite šiuos veiksmus:
-
Įdiekite Gunicorn:
pip install gunicorn pip freeze > requirements.txt -
Paleiskite savo programą naudodami Gunicorn su
app:appargumentu (kur pirmasisappyra failo pavadinimas, o antrasisappyra Flask instancija):ENV=production gunicorn app:app \ --error-logfile - \ -b 0.0.0.0:8080 -
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.
Jūsų Python kodo diegimas gamyboje
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ą
"Stackhero for Python" paslaugos konfigūravimas
Norėdami diegti savo kodą į Stackhero, vykdykite šiuos veiksmus:
-
Gaukite savo viešąjį raktą naudodami:
cat ~/.ssh/id_*.pub -
Stackhero prietaisų skydelyje eikite į savo "Stackhero for Python" paslaugą ir spustelėkite mygtuką "Konfigūruoti".
-
Nukopijuokite viešąjį raktą iš pirmojo žingsnio ir įklijuokite jį į "SSH public keys" arba "Key" lauką.
-
Patvirtinkite konfigūraciją spustelėdami mygtuką "Patvirtinti" puslapio apačioje.
"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ė komanda
Diegimas gamyboje
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+PWindows/Linux arbaCmd+Shift+PmacOS ir įveskiteGit: 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ą.
Išvada
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.