portaldacalheta.pt
  • Κύριος
  • Σχεδιασμός Ux
  • Κερδοφορία & Αποδοτικότητα
  • Κύκλος Ζωής Προϊόντος
  • Ευκίνητος
Διεπαφή Ιστού

Δημιουργία ενός API ανάπαυσης με το πλαίσιο μπουκαλιών



Τα API REST έχουν γίνει ένας κοινός τρόπος δημιουργίας διεπαφής μεταξύ ιστού οπίσθια άκρα και μπροστινά άκρα και μεταξύ διαφορετικών διαδικτυακών υπηρεσιών. Η απλότητα αυτού του είδους της διασύνδεσης και η πανταχού παρούσα υποστήριξη των πρωτοκόλλων HTTP και HTTPS σε διαφορετικά δίκτυα και πλαίσια, το καθιστούν μια εύκολη επιλογή όταν εξετάζουμε ζητήματα διαλειτουργικότητας.

Μπουκάλι είναι ένα μινιμαλιστικό διαδικτυακό πλαίσιο Python. Είναι ελαφρύ, γρήγορο και εύκολο στη χρήση και είναι κατάλληλο για την κατασκευή υπηρεσιών RESTful. ΕΝΑ σύγκριση γυμνών οστών φτιαγμένο από Άντρι Κορνάτσκι βάλτε το ανάμεσα στα τρία κορυφαία πλαίσια όσον αφορά το χρόνο απόκρισης και την απόδοση (αιτήσεις ανά δευτερόλεπτο). Στις δικές μου δοκιμές στους εικονικούς διακομιστές που διατίθενται από το DigitalOcean, διαπίστωσα ότι ο συνδυασμός της στοίβας διακομιστή uWSGI και της φιάλης θα μπορούσε να επιτύχει τόσο χαμηλά όσο τα γενικά 140μs ανά αίτημα.



Σε αυτό το άρθρο, θα σας δώσω μια αναλυτική περιγραφή του τρόπου δημιουργίας μιας υπηρεσίας RESTful API χρησιμοποιώντας το Bottle.



Μπουκάλι: Ένα γρήγορο και ελαφρύ πλαίσιο Web Python



Εγκατάσταση και διαμόρφωση

Το πλαίσιο φιαλών επιτυγχάνει εντυπωσιακή απόδοση εν μέρει χάρη στο μικρό του βάρος. Στην πραγματικότητα, ολόκληρη η βιβλιοθήκη διανέμεται ως ενότητα ενός αρχείου. Αυτό σημαίνει ότι δεν κρατά το χέρι σας όσο άλλα πλαίσια, αλλά είναι επίσης πιο ευέλικτο και μπορεί να προσαρμοστεί ώστε να χωράει σε πολλές διαφορετικές τεχνολογικές στοίβες. Το μπουκάλι είναι επομένως πιο κατάλληλο για έργα όπου η απόδοση και η προσαρμοστικότητα είναι εξαιρετικής ποιότητας, και όπου τα πλεονεκτήματα εξοικονόμησης χρόνου των πιο βαρέων πλαισίων είναι λιγότερο προβληματικά.

Η ευελιξία της φιάλης καθιστά μια σε βάθος περιγραφή της ρύθμισης της πλατφόρμας λίγο μάταιη, καθώς μπορεί να μην αντικατοπτρίζει τη δική σας στοίβα. Ωστόσο, μια γρήγορη επισκόπηση των επιλογών και πού να μάθετε περισσότερα σχετικά με τον τρόπο ρύθμισής τους, είναι κατάλληλη εδώ:



Εγκατάσταση

Η εγκατάσταση του μπουκαλιού είναι τόσο εύκολη όσο η εγκατάσταση οποιουδήποτε άλλου πακέτου Python. Οι επιλογές σας είναι:

  • Εγκαταστήστε στο σύστημά σας χρησιμοποιώντας τον διαχειριστή πακέτων του συστήματος. Η Debian Jessie (τρέχουσα σταθερή) συσκευάζει την έκδοση 0.12 ως μπουκάλι πύθωνα .
  • Εγκαταστήστε στο σύστημά σας χρησιμοποιώντας το Ευρετήριο πακέτων Python με pip install bottle.
  • Εγκατάσταση σε εικονικό περιβάλλον (συνιστάται).

Για να εγκαταστήσετε το μπουκάλι σε ένα εικονικό περιβάλλον, θα χρειαστείτε το virtualenv και κουκούτσι εργαλεία. Για να τα εγκαταστήσετε, ανατρέξτε στο virtualenv και κουκούτσι τεκμηρίωση, αν και τα έχετε ήδη στο σύστημά σας.



Στο Bash, δημιουργήστε ένα περιβάλλον με το Python 3:

$ virtualenv -p `which python3` env

Καταστολή του -p `which python3` Η παράμετρος θα οδηγήσει στην εγκατάσταση του προεπιλεγμένου διερμηνέα Python που υπάρχει στο σύστημα - συνήθως Python 2.7. Το Python 2.7 υποστηρίζεται, αλλά αυτό το σεμινάριο προϋποθέτει το Python 3.4.



Τώρα ενεργοποιήστε το περιβάλλον και εγκαταστήστε το μπουκάλι:

$ . env/bin/activate $ pip install bottle

Αυτό είναι. Το μπουκάλι είναι εγκατεστημένο και έτοιμο για χρήση. Εάν δεν είστε εξοικειωμένοι με virtualenv ή κουκούτσι , η τεκμηρίωσή τους είναι κορυφαία. Ρίξε μια ματιά! Αξίζει τον κόπο.



Υπηρέτης

Το μπουκάλι συμμορφώνεται με τα πρότυπα της Python Διασύνδεση πύλης διακομιστή Ιστού (WSGI) , που σημαίνει ότι μπορεί να χρησιμοποιηθεί με οποιονδήποτε διακομιστή συμβατό με WSGI. Αυτό περιλαμβάνει uWSGI , Ανεμοστρόβιλος , Gunicorn , Απάχης , Amazon Beanstalk , Μηχανή εφαρμογών Google , και άλλοι.

Ο σωστός τρόπος ρύθμισής του διαφέρει ελαφρώς σε κάθε περιβάλλον. Το μπουκάλι εκθέτει ένα αντικείμενο που συμμορφώνεται με τη διεπαφή WSGI και ο διακομιστής πρέπει να ρυθμιστεί ώστε να αλληλεπιδρά με αυτό το αντικείμενο.



Για να μάθετε περισσότερα σχετικά με τον τρόπο ρύθμισης του διακομιστή σας, ανατρέξτε στα έγγραφα του διακομιστή και στα έγγραφα του Bottle, εδώ .

Βάση δεδομένων

Η φιάλη είναι αγνωστικη βάση δεδομένων και δεν ενδιαφέρεται από πού προέρχονται τα δεδομένα. Εάν θέλετε να χρησιμοποιήσετε μια βάση δεδομένων στην εφαρμογή σας, το Ευρετήριο πακέτων Python έχει πολλές ενδιαφέρουσες επιλογές, όπως SQLAlchemy , PyMongo , MongoEngine , CouchDB και Ψήφοι για το DynamoDB. Χρειάζεστε μόνο τον κατάλληλο προσαρμογέα για να λειτουργεί με τη βάση δεδομένων της επιλογής σας.

Βασικά πλαίσια μπουκαλιών

Τώρα, ας δούμε πώς να φτιάξετε μια βασική εφαρμογή στο Μπουκάλι. Για παραδείγματα κώδικα, θα υποθέσω το Python> = 3.4. Ωστόσο, τα περισσότερα από αυτά που θα γράψω εδώ θα λειτουργήσουν και στο Python 2.7.

Μια βασική εφαρμογή στο Μπουκάλι μοιάζει με αυτό:

import bottle app = application = bottle.default_app() if __name__ == '__main__': bottle.run(host = '127.0.0.1', port = 8000)

Όταν λέω βασικά, εννοώ ότι αυτό το πρόγραμμα δεν σας κάνει καν 'Γεια σας Κόσμος'. (Πότε ήταν η τελευταία φορά που αποκτήσατε πρόσβαση σε μια διεπαφή REST που απάντησε 'Hello World;') Όλα τα αιτήματα HTTP σε 127.0.0.1:8000 θα λάβει μια κατάσταση απόκρισης 404 Not Found.

Εφαρμογές σε μπουκάλι

Το μπουκάλι μπορεί να έχει αρκετές παρουσίες εφαρμογών, αλλά για λόγους ευκολίας δημιουργείται η πρώτη παρουσία για εσάς. αυτή είναι η προεπιλεγμένη εφαρμογή. Το μπουκάλι διατηρεί αυτές τις εμφανίσεις σε μια στοίβα εσωτερική στη μονάδα. Κάθε φορά που κάνετε κάτι με το Μπουκάλι (όπως η εκτέλεση της εφαρμογής ή η επισύναψη διαδρομής) και δεν καθορίζετε ποια εφαρμογή μιλάτε, αναφέρεται στην προεπιλεγμένη εφαρμογή. Στην πραγματικότητα, το app = application = bottle.default_app() Η γραμμή δεν χρειάζεται καν να υπάρχει σε αυτήν τη βασική εφαρμογή, αλλά είναι εκεί, ώστε να μπορούμε να καλέσουμε εύκολα την προεπιλεγμένη εφαρμογή με Gunicorn, uWSGI ή κάποιον γενικό διακομιστή WSGI.

Η πιθανότητα πολλαπλών εφαρμογών μπορεί να φαίνεται αρχικά συγκεχυμένη, αλλά προσθέτουν ευελιξία στο Bottle. Για διαφορετικές ενότητες της εφαρμογής σας, μπορείτε να δημιουργήσετε εξειδικευμένες εφαρμογές μπουκαλιών, δημιουργώντας άλλες κατηγορίες μπουκαλιών και ρυθμίζοντας τις με διαφορετικές διαμορφώσεις ανάλογα με τις ανάγκες. Αυτές οι διαφορετικές εφαρμογές θα μπορούσαν να έχουν πρόσβαση από διαφορετικά URL, μέσω του δρομολογητή URL του Bottle. Δεν θα το εξετάσουμε σε αυτό το σεμινάριο, αλλά σας ενθαρρύνουμε να ρίξετε μια ματιά στην τεκμηρίωση του Bottle εδώ και εδώ .

Επίκληση διακομιστή

Η τελευταία γραμμή του σεναρίου τρέχει Μπουκάλι χρησιμοποιώντας τον υποδεικνυόμενο διακομιστή. Εάν δεν αναφέρεται διακομιστής, όπως συμβαίνει εδώ, ο προεπιλεγμένος διακομιστής είναι ο ενσωματωμένος διακομιστής αναφοράς WSGI της Python, ο οποίος είναι κατάλληλος μόνο για αναπτυξιακούς σκοπούς. Ένας διαφορετικός διακομιστής μπορεί να χρησιμοποιηθεί ως εξής:

bottle.run(server='gunicorn', host = '127.0.0.1', port = 8000)

Αυτή είναι η συντακτική ζάχαρη που σας επιτρέπει να ξεκινήσετε την εφαρμογή εκτελώντας αυτό το σενάριο. Για παράδειγμα, εάν αυτό το αρχείο ονομάζεται main.py, μπορείτε απλώς να εκτελέσετε python main.py για να ξεκινήσετε την εφαρμογή. Το μπουκάλι μεταφέρει αρκετά εκτεταμένη λίστα με προσαρμογείς διακομιστή που μπορεί να χρησιμοποιηθεί με αυτόν τον τρόπο.

Ορισμένοι διακομιστές WSGI δεν διαθέτουν προσαρμογείς μπουκαλιών. Αυτά μπορούν να ξεκινήσουν με τις εντολές εκτέλεσης του διακομιστή. Στο uWSGI, για παράδειγμα, το μόνο που πρέπει να κάνετε είναι να καλέσετε uwsgi σαν αυτό:

$ uwsgi --http :8000 --wsgi-file main.py

Μια σημείωση για τη δομή αρχείων

Το Bottle αφήνει τη δομή αρχείων της εφαρμογής σας αποκλειστικά από εσάς. Έχω διαπιστώσει ότι οι πολιτικές δομής αρχείων μου εξελίσσονται από έργο σε έργο, αλλά τείνουν να βασίζονται σε μια φιλοσοφία MVC.

Δημιουργία του REST API σας

Φυσικά, κανείς δεν χρειάζεται διακομιστή που να επιστρέφει μόνο 404 για κάθε URI που ζητήθηκε. Σας υποσχέθηκα ότι θα δημιουργήσουμε ένα REST API, οπότε ας το κάνουμε.

Ας υποθέσουμε ότι θέλετε δημιουργήστε μια διεπαφή που χειρίζεται ένα σύνολο ονομάτων. Σε μια πραγματική εφαρμογή θα χρησιμοποιούσατε πιθανώς μια βάση δεδομένων για αυτό, αλλά για αυτό το παράδειγμα θα χρησιμοποιήσουμε απλώς τη μνήμη set δομή δεδομένων.

Ο σκελετός του API μας μπορεί να μοιάζει με αυτό. Μπορείτε να τοποθετήσετε αυτόν τον κωδικό οπουδήποτε στο έργο, αλλά η πρότασή μου θα ήταν ένα ξεχωριστό αρχείο API, όπως api/names.py.

from bottle import request, response from bottle import post, get, put, delete _names = set() # the set of names @post('/names') def creation_handler(): '''Handles name creation''' pass @get('/names') def listing_handler(): '''Handles name listing''' pass @put('/names/') def update_handler(name): '''Handles name updates''' pass @delete('/names/') def delete_handler(name): '''Handles name deletions''' pass

Δρομολόγηση

Όπως μπορούμε να δούμε, η δρομολόγηση στο Μπουκάλι γίνεται με διακοσμητές. Οι εισαγόμενοι διακοσμητές post, get, put, και delete εγγραφείτε χειριστές για αυτές τις τέσσερις ενέργειες. Κατανοώντας πώς μπορούν να αναλυθούν αυτές οι εργασίες ως εξής:

  • Όλοι οι παραπάνω διακοσμητές είναι μια συντόμευση στο default_app δρομολογητές διακοσμητές. Για παράδειγμα, το @get() ισχύει ο διακοσμητής bottle.default_app().get() στον χειριστή.
  • Οι μέθοδοι δρομολόγησης στο default_app είναι όλες οι συντομεύσεις για route(). Λοιπόν default_app().get('/') είναι ισοδύναμο με default_app().route(method='GET', '/').

Λοιπόν @get('/') είναι το ίδιο με το @route(method='GET', '/'), το οποίο είναι το ίδιο με το @bottle.default_app().route(method='GET', '/'), και αυτά μπορούν να χρησιμοποιηθούν εναλλακτικά.

Ένα χρήσιμο πράγμα για το @route ο διακοσμητής είναι ότι εάν θέλετε, για παράδειγμα, να χρησιμοποιήσετε τον ίδιο χειριστή για να χειριστείτε τόσο τις ενημερώσεις αντικειμένων όσο και τις διαγραφές, θα μπορούσατε απλώς να περάσετε μια λίστα με τις μεθόδους που χειρίζεται ως εξής:

@route('/names/', method=['PUT', 'DELETE']) def update_delete_handler(name): '''Handles name updates and deletions''' pass

Εντάξει λοιπόν, ας εφαρμόσουμε μερικούς από αυτούς τους χειριστές.

Δημιουργήστε το τέλειο REST API με το Bottle Framework.

Τα RESTful APIs αποτελούν βασικό στοιχείο της σύγχρονης ανάπτυξης ιστού. Εξυπηρετήστε τους πελάτες σας API μια ισχυρή παρασκευή με ένα back-end μπουκάλι. Τιτίβισμα

POST: Δημιουργία πόρων

Ο χειριστής μας POST μπορεί να μοιάζει με αυτό:

import re, json namepattern = re.compile(r'^[a-zA-Zd]{1,64}$') @post('/names') def creation_handler(): '''Handles name creation''' try: # parse input data try: data = request.json() except: raise ValueError if data is None: raise ValueError # extract and validate name try: if namepattern.match(data['name']) is None: raise ValueError name = data['name'] except (TypeError, KeyError): raise ValueError # check for existence if name in _names: raise KeyError except ValueError: # if bad request data, return 400 Bad Request response.status = 400 return except KeyError: # if name already exists, return 409 Conflict response.status = 409 return # add name _names.add(name) # return 200 Success response.headers['Content-Type'] = 'application/json' return json.dumps({'name': name})

Λοιπόν, αυτό είναι πολύ. Ας εξετάσουμε αυτά τα βήματα εν μέρει.

Ανάλυση σώματος

Αυτό το API απαιτεί από τον χρήστη να POST μια συμβολοσειρά JSON στο σώμα με ένα χαρακτηριστικό που ονομάζεται 'όνομα'.

Το request αντικείμενο που εισήχθη νωρίτερα από bottle πάντα δείχνει το τρέχον αίτημα και διατηρεί όλα τα δεδομένα του αιτήματος. Είναι body Το χαρακτηριστικό περιέχει μια ροή byte του σώματος αιτήματος, στην οποία μπορείτε να αποκτήσετε πρόσβαση από οποιαδήποτε λειτουργία που μπορεί να διαβάσει ένα αντικείμενο ροής (όπως ανάγνωση ενός αρχείου).

Το request.json() Η μέθοδος ελέγχει τις κεφαλίδες του αιτήματος για τον τύπο περιεχομένου 'application / json' και αναλύει το σώμα εάν είναι σωστό. Εάν το μπουκάλι εντοπίσει εσφαλμένο σώμα (π.χ. κενό ή με λάθος τύπο περιεχομένου), αυτή η μέθοδος επιστρέφει None και έτσι αυξάνουμε ένα ValueError. Εάν το περιεχόμενο JSON έχει λανθασμένη ανίχνευση από τον αναλυτή JSON. εγείρει μια εξαίρεση ότι πιάνουμε και αναζωογονούμε, και πάλι ως ValueError.

Ανάλυση αντικειμένων και επικύρωση

Εάν δεν υπάρχουν σφάλματα, έχουμε μετατρέψει το σώμα του αιτήματος σε ένα αντικείμενο Python που αναφέρεται από το data μεταβλητός. Εάν έχουμε λάβει ένα λεξικό με το κλειδί 'name', θα έχουμε πρόσβαση σε αυτό μέσω data['name']. Εάν λάβαμε ένα λεξικό χωρίς αυτό το κλειδί, η προσπάθεια πρόσβασης σε αυτό θα μας οδηγήσει σε ένα KeyError εξαίρεση. Εάν λάβουμε οτιδήποτε άλλο εκτός από λεξικό, θα λάβουμε ένα TypeError εξαίρεση. Εάν παρουσιαστεί κάποιο από αυτά τα σφάλματα, για άλλη μια φορά, το επαναπροσδιορίζουμε ως ValueError, υποδεικνύοντας μια κακή είσοδο.

Για να ελέγξουμε αν το κλειδί ονόματος έχει τη σωστή μορφή, θα πρέπει να το δοκιμάσουμε με μια μάσκα regex, όπως το namepattern μάσκα που δημιουργήσαμε εδώ. Εάν το κλειδί name δεν είναι συμβολοσειρά, namepattern.match() θα αυξήσει ένα TypeError και αν δεν ταιριάζει θα επιστρέψει None.

Με τη μάσκα σε αυτό το παράδειγμα, ένα όνομα πρέπει να είναι αλφαριθμητικό ASCII χωρίς κενά από 1 έως 64 χαρακτήρες. Αυτή είναι μια απλή επικύρωση και δεν ελέγχει για ένα αντικείμενο με δεδομένα σκουπιδιών, για παράδειγμα. Πιο περίπλοκη και πλήρης επικύρωση μπορεί να επιτευχθεί με τη χρήση εργαλείων όπως FormEncode .

Δοκιμή για ύπαρξη

Η τελευταία δοκιμή πριν από την εκπλήρωση του αιτήματος είναι εάν το δεδομένο όνομα υπάρχει ήδη στο σύνολο. Σε μια πιο δομημένη εφαρμογή, αυτή η δοκιμή θα πρέπει πιθανώς να γίνει από μια ειδική ενότητα και να επισημανθεί στο API μας μέσω μιας εξειδικευμένης εξαίρεσης, αλλά επειδή χειριζόμαστε ένα σύνολο απευθείας, πρέπει να το κάνουμε εδώ.

Σηματοδοτούμε την ύπαρξη του ονόματος αυξάνοντας ένα KeyError.

Απαντήσεις σφαλμάτων

Ακριβώς όπως το αντικείμενο αιτήματος διατηρεί όλα τα δεδομένα αιτήματος, το αντικείμενο απόκρισης κάνει το ίδιο για τα δεδομένα απόκρισης. Υπάρχουν δύο τρόποι καθορισμού της κατάστασης απόκρισης:

response.status = 400

και:

response.status = '400 Bad Request'

Για παράδειγμα, επιλέξαμε την απλούστερη φόρμα, αλλά η δεύτερη φόρμα μπορεί να χρησιμοποιηθεί για τον καθορισμό της περιγραφής κειμένου του σφάλματος. Εσωτερικά, το Bottle θα χωρίσει τη δεύτερη συμβολοσειρά και θα ορίσει τον αριθμητικό κωδικό κατάλληλα.

Απόκριση επιτυχίας

Εάν όλα τα βήματα είναι επιτυχημένα, ικανοποιούμε το αίτημα προσθέτοντας το όνομα στο σύνολο _names, ρυθμίζοντας το Content-Type κεφαλίδα απόκρισης και επιστροφή της απόκρισης. Κάθε συμβολοσειρά που επιστρέφεται από τη συνάρτηση θα αντιμετωπίζεται ως το σώμα απόκρισης ενός 200 Success απάντηση, έτσι δημιουργούμε απλώς ένα με json.dumps.

GET: Λίστα πόρων

Προχωρώντας από τη δημιουργία ονομάτων, θα εφαρμόσουμε τον χειριστή καταχώρισης ονομάτων:

@get('/names') def listing_handler(): '''Handles name listing''' response.headers['Content-Type'] = 'application/json' response.headers['Cache-Control'] = 'no-cache' return json.dumps({'names': list(_names)})

Η καταχώριση των ονομάτων ήταν πολύ πιο εύκολη, έτσι δεν είναι; Σε σύγκριση με τη δημιουργία ονομάτων δεν υπάρχουν πολλά να κάνουμε εδώ. Απλώς ορίστε μερικές κεφαλίδες απόκρισης και επιστρέψτε μια αναπαράσταση JSON όλων των ονομάτων και τελειώσαμε.

PUT: Ενημέρωση πόρων

Τώρα, ας δούμε πώς να εφαρμόσουμε τη μέθοδο ενημέρωσης. Δεν διαφέρει πολύ από τη μέθοδο δημιουργίας, αλλά χρησιμοποιούμε αυτό το παράδειγμα για την εισαγωγή παραμέτρων URI.

@put('/names/') def update_handler(name): '''Handles name updates''' try: # parse input data try: data = json.load(utf8reader(request.body)) except: raise ValueError # extract and validate new name try: if namepattern.match(data['name']) is None: raise ValueError newname = data['name'] except (TypeError, KeyError): raise ValueError # check if updated name exists if oldname not in _names: raise KeyError(404) # check if new name exists if name in _names: raise KeyError(409) except ValueError: response.status = 400 return except KeyError as e: response.status = e.args[0] return # add new name and remove old name _names.remove(oldname) _names.add(newname) # return 200 Success response.headers['Content-Type'] = 'application/json' return json.dumps({'name': newname})

Το σχήμα σώματος για την ενέργεια ενημέρωσης είναι το ίδιο με εκείνο της ενέργειας δημιουργίας, αλλά τώρα έχουμε επίσης ένα νέο oldname παράμετρο στο URI, όπως ορίζεται από τη διαδρομή @put('/names/').

ανταποκρινόμενη σχεδίαση ερωτήματα μέσων css

Παράμετροι URI

Όπως μπορείτε να δείτε, η σημείωση του μπουκαλιού για τις παραμέτρους URI είναι πολύ απλή. Μπορείτε να δημιουργήσετε URI με όσες παραμέτρους θέλετε. Το μπουκάλι τα εξαγάγει αυτόματα από το URI και τα μεταφέρει στον χειριστή αιτήσεων:

@get('//') def handler(param1, param2): pass

Χρησιμοποιώντας διαδοχικά διακοσμητές διαδρομών, μπορείτε να δημιουργήσετε URI με προαιρετικές παραμέτρους:

@get('/') @get('//') def handler(param1, param2 = None) pass

Επίσης, το Bottle επιτρέπει τα ακόλουθα φίλτρα δρομολόγησης σε URI:

  • int

Αντιστοιχεί μόνο σε παραμέτρους που μπορούν να μετατραπούν σε int και μεταβιβάζει την τιμή μετατροπής στον χειριστή:

@get('/') def handler(param): pass
  • float

Το ίδιο με int, αλλά με τιμές κυμαινόμενου σημείου:

@get('/') def handler(param): pass
  • re (κανονικές εκφράσεις)

Αντιστοιχεί μόνο σε παραμέτρους που αντιστοιχούν στη δεδομένη κανονική έκφραση:

@get('/') def handler(param): pass
  • path

Αντιστοιχεί στις υποενότητες της διαδρομής URI με ευέλικτο τρόπο:

@get('//id>') def handler(param): pass

Αγώνες:

  • /x/id, περνώντας x ως param.
  • /x/y/id, περνώντας x/y ως param.

ΔΙΑΓΡΑΦΗ: Διαγραφή πόρων

Όπως και η μέθοδος GET, η μέθοδος DELETE μας φέρνει λίγα νέα. Απλώς σημειώστε ότι επιστρέφετε None χωρίς να ορίσετε μια κατάσταση επιστρέφει μια απάντηση με ένα κενό σώμα και έναν κωδικό κατάστασης 200.

@delete('/names/') def delete_handler(name): '''Handles name updates''' try: # Check if name exists if name not in _names: raise KeyError except KeyError: response.status = 404 return # Remove name _names.remove(name) return

Τελικό βήμα: Ενεργοποίηση του API

Ας υποθέσουμε ότι έχουμε αποθηκεύσει το API ονομάτων μας ως api/names.py , μπορούμε τώρα να ενεργοποιήσουμε αυτές τις διαδρομές στο κύριο αρχείο εφαρμογής main.py.

import bottle from api import names app = application = bottle.default_app() if __name__ == '__main__': bottle.run(host = '127.0.0.1', port = 8000)

Έχετε υπόψη ότι εισαγάγαμε μόνο το names μονάδα μέτρησης. Δεδομένου ότι έχουμε διακοσμήσει όλες τις μεθόδους με τα URI που είναι συνδεδεμένα στην προεπιλεγμένη εφαρμογή, δεν χρειάζεται να κάνετε περαιτέρω ρύθμιση. Οι μέθοδοι μας είναι ήδη διαθέσιμες, έτοιμες για πρόσβαση.

Τίποτα δεν κάνει ένα front-end χαρούμενο σαν ένα καλοφτιαγμένο REST API. Δουλεύει άψογα!

Μπορείτε να χρησιμοποιήσετε εργαλεία όπως Curl ή Postman για να καταναλώσετε το API και να το δοκιμάσετε χειροκίνητα. (Εάν χρησιμοποιείτε Curl, μπορείτε να χρησιμοποιήσετε ένα Διαμορφωτής JSON για να κάνει την απάντηση να φαίνεται λιγότερο γεμάτη.)

Μπόνους: Διανομή πόρων Cross Origin (CORS)

Ένας κοινός λόγος για τη δημιουργία ενός REST API είναι η επικοινωνία με μια διεπαφή JavaScript μέσω του AJAX. Για ορισμένες εφαρμογές, αυτά τα αιτήματα θα πρέπει να επιτρέπονται να προέρχονται από οποιονδήποτε τομέα και όχι μόνο από τον αρχικό τομέα του API σας. Από προεπιλογή, τα περισσότερα προγράμματα περιήγησης δεν επιτρέπουν αυτήν τη συμπεριφορά, επομένως επιτρέψτε μου να σας δείξω πώς να ρυθμίσετε διαμοιρασμός πόρων πολλαπλής προέλευσης (CORS) στο μπουκάλι για να το επιτρέψετε:

from bottle import hook, route, response _allow_origin = '*' _allow_methods = 'PUT, GET, POST, DELETE, OPTIONS' _allow_headers = 'Authorization, Origin, Accept, Content-Type, X-Requested-With' @hook('after_request') def enable_cors(): '''Add headers to enable CORS''' response.headers['Access-Control-Allow-Origin'] = _allow_origin response.headers['Access-Control-Allow-Methods'] = _allow_methods response.headers['Access-Control-Allow-Headers'] = _allow_headers @route('/', method = 'OPTIONS') @route('/', method = 'OPTIONS') def options_handler(path = None): return

Το hook Ο διακοσμητής μας επιτρέπει να καλέσουμε μια συνάρτηση πριν ή μετά από κάθε αίτημα. Στην περίπτωσή μας, για να ενεργοποιήσουμε τους CORS πρέπει να ορίσουμε τα Access-Control-Allow-Origin, -Allow-Methods και -Allow-Headers κεφαλίδες για κάθε μία από τις απαντήσεις μας. Αυτά δείχνουν στον αιτούντα ότι θα εξυπηρετήσουμε τα υποδεικνυόμενα αιτήματα.

Επίσης, ο πελάτης μπορεί να υποβάλει ένα αίτημα ΕΠΙΛΟΓΕΣ HTTP στον διακομιστή για να δει εάν μπορεί πραγματικά να κάνει αιτήματα με άλλες μεθόδους. Με αυτό το δείγμα catch-all παράδειγμα, ανταποκρινόμαστε σε όλα τα αιτήματα OPTIONS με κωδικό κατάστασης 200 και κενό σώμα.

Για να το ενεργοποιήσετε, απλώς αποθηκεύστε το και εισαγάγετέ το από την κύρια μονάδα.

Τύλιξε

Αυτό είναι το μόνο που υπάρχει!

Με αυτό το σεμινάριο, προσπάθησα να καλύψω τα βασικά βήματα για να δημιουργήσω ένα REST API για μια εφαρμογή Python με το πλαίσιο ιστού Bottle.

Μπορείτε να εμβαθύνετε τις γνώσεις σας σχετικά με αυτό το μικρό αλλά ισχυρό πλαίσιο με την επίσκεψή του φροντιστήριο και Έγγραφα αναφοράς API .

Σχετίζεται με: Δημιουργία ενός Node.js / TypeScript REST API, Μέρος 1: Express.js

Πώς να φτιάξετε ένα Disc Disc Bot: μια επισκόπηση και έναν οδηγό

Τεχνολογία

Πώς να φτιάξετε ένα Disc Disc Bot: μια επισκόπηση και έναν οδηγό
Κατανόηση των αποχρώσεων της ταξινόμησης χαρακτήρων

Κατανόηση των αποχρώσεων της ταξινόμησης χαρακτήρων

Σχεδιασμός Διεπαφής Χρήστη

Δημοφιλείς Αναρτήσεις
Αισθητική και αντίληψη - Τρόπος προσέγγισης εικόνων εμπειρίας χρήστη
Αισθητική και αντίληψη - Τρόπος προσέγγισης εικόνων εμπειρίας χρήστη
Βέλτιστες πρακτικές διάταξης ιστού: Αναλύθηκαν 12 διαχρονικά μοτίβα διεπαφής χρήστη
Βέλτιστες πρακτικές διάταξης ιστού: Αναλύθηκαν 12 διαχρονικά μοτίβα διεπαφής χρήστη
Εξοικείωση με το Πρόγραμμα ανάπτυξης Sketch
Εξοικείωση με το Πρόγραμμα ανάπτυξης Sketch
Mini Tutorial - Ένας οδηγός για συνδυασμούς γραμματοσειρών
Mini Tutorial - Ένας οδηγός για συνδυασμούς γραμματοσειρών
Για Σχεδιαστές με Αγάπη (Ένα Γράμμα από έναν Προγραμματιστή Front-end)
Για Σχεδιαστές με Αγάπη (Ένα Γράμμα από έναν Προγραμματιστή Front-end)
 
Σχεδιασμός βάσει δεδομένων και γενετικός σχεδιασμός - Μια επισκόπηση
Σχεδιασμός βάσει δεδομένων και γενετικός σχεδιασμός - Μια επισκόπηση
Διακομιστές ARM: Κινητή αρχιτεκτονική CPU για κέντρα δεδομένων;
Διακομιστές ARM: Κινητή αρχιτεκτονική CPU για κέντρα δεδομένων;
Ξεκινήστε με μικροσυσκευές: Ένα εκπαιδευτικό πρόγραμμα Dropwizard
Ξεκινήστε με μικροσυσκευές: Ένα εκπαιδευτικό πρόγραμμα Dropwizard
Μείνετε Sharp - Πώς να ενισχύσετε τη δημιουργικότητα όταν υποχωρεί η εργασία
Μείνετε Sharp - Πώς να ενισχύσετε τη δημιουργικότητα όταν υποχωρεί η εργασία
Ditch MVP, Υιοθετήστε Ελάχιστα Βιώσιμα Πρωτότυπα (MVPr)
Ditch MVP, Υιοθετήστε Ελάχιστα Βιώσιμα Πρωτότυπα (MVPr)
Δημοφιλείς Αναρτήσεις
  • βέλτιστες πρακτικές java δοκιμής μονάδων
  • προβλήματα ασφάλειας στον κυβερνοχώρο και λύσεις
  • εργαλεία γραμμής εντολών για windows
  • υπολογιστής τιμής πλήρους απασχόλησης για συμβόλαιο
  • πώς να χρησιμοποιήσετε το powerpivot στο excel 2016
  • s corp vs c corp
  • ποια είναι η ελαστικότητα της ζήτησης ως προς την τιμή;
Κατηγορίες
  • Σχεδιασμός Ux
  • Κερδοφορία & Αποδοτικότητα
  • Κύκλος Ζωής Προϊόντος
  • Ευκίνητος
  • © 2022 | Ολα Τα Δικαιώματα Διατηρούνται

    portaldacalheta.pt