Heim >Backend-Entwicklung >Python-Tutorial >Jagd auf Heisenberg mit dem Django Rest Framework
Die Idee bestand darin, eine einfache Plattform für DEA-Agenten zu schaffen, um Informationen über Charaktere aus dem Breaking Bad/Better Call Saul-Universum zu verwalten. Um den DEA-Agenten das Leben zu erleichtern, benötigen sie einen API-Endpunkt, der es ermöglicht, Informationen über Charaktere nach ihrem Namen, Geburtsdatum, Beruf oder der Tatsache, ob es sich um einen Verdächtigen handelt, zu filtern.
Während die DEA versucht, Drogenbosse hinter Gitter zu bringen, verfolgt sie sie und die Menschen in ihrer Umgebung. Sie speichern Zeitstempel und bestimmte Standorte als geografische Koordinaten in einer zugehörigen Tabelle. Der Endpunkt, der die Daten offenlegt, muss das Filtern von Standorteinträgen ermöglichen, die sich innerhalb einer bestimmten Entfernung von einem bestimmten geografischen Punkt befanden, sowie der Person, der sie zugewiesen wurden, und des Datums-/Uhrzeitbereichs, in dem sie aufgezeichnet wurden. Die Reihenfolge für diesen Endpunkt sollte die Berücksichtigung der Entfernung von einem bestimmten geografischen Punkt ermöglichen, sowohl aufsteigend als auch absteigend.
Um zu sehen, wie es gemacht wurde, können Sie dieses Projekt lokal einrichten, indem Sie der folgenden Dokumentation folgen und es selbst testen.
Den Code finden Sie hier in meinem GitHub-Repository.
Als Voraussetzung müssen Docker und docker-compose auf Ihrem System installiert sein.
Gehen Sie zunächst in den Ordner Ihres Projekts und klonen Sie das Breaking Bad API-Repository:
git clone git@github.com:drangovski/breaking-bad-api.git
CD Breaking-Bad-API
Dann müssen Sie eine .env-Datei erstellen, in der Sie die Werte für die folgenden Variablen eingeben:
POSTGRES_USER=heisenberg POSTGRES_PASSWORD=iamthedanger POSTGRES_DB=breakingbad DEBUG=True SECRET_KEY="<SECRET KEY>" DJANGO_ALLOWED_HOSTS=localhost 127.0.0.1 [::1] SQL_ENGINE=django.db.backends.postgresql SQL_DATABASE=breakingbad SQL_USER=heisenberg SQL_PASSWORD=iamthedanger SQL_HOST=db<br /> SQL_PORT=5432
Hinweis: Wenn Sie möchten, können Sie die Datei env_generator.sh verwenden, um eine .env-Datei für Sie zu erstellen. Dadurch wird automatisch auch der SECRET_KEY generiert. Um diese Datei auszuführen, erteilen Sie ihr zunächst die Berechtigung mit chmod x env_generator.sh und führen Sie sie dann mit ./env_generator.sh
aus
Sobald Sie dieses Set haben, können Sie Folgendes ausführen:
Docker-Compose-Build
docker-compose up
Dadurch wird die Django-Anwendung bei localhost:8000 gestartet. Um auf die API zuzugreifen, lautet die URL localhost:8000/api.
Um dem Thema dieser Projekte gerecht zu werden (und um Ihnen das Leben ein wenig zu erleichtern :)), können Sie eventuell die folgenden Orte und ihre Koordinaten verwenden:
Location | Longitude | Latitude |
---|---|---|
Los Pollos Hermanos | 35.06534619552971 | -106.64463423464572 |
Walter White House | 35.12625330483283 | -106.53566597939896 |
Saul Goodman Office | 35.12958969793146 | -106.53106126774908 |
Mike Ehrmantraut House | 35.08486667169461 | -106.64115047513016 |
Jessie Pinkman House | 35.078341181544396 | -106.62404891988452 |
Hank & Marrie House | 35.13512843853582 | -106.48159991250327 |
import requests import json url = 'http://localhost:8000/api/characters/' headers = {'Content-Type' : "application/json"} response = requests.get(url, headers=headers, verify=False) if response.status_code == 200: data = response.json() print(json.dumps(data, indent=2)) else: print("Request failed with status code:", response.status_code)
Um alle vorhandenen Zeichen in der Datenbank abzurufen.
GET /api/characters/
[ { "id": 1, "name": "Walter White", "occupation": "Chemistry Professor", "date_of_birth": "1971", "suspect": false }, { "id": 2, "name": "Tuco Salamanca", "occupation": "Grandpa Keeper", "date_of_birth": "1976", "suspect": true } ]
Um ein einzelnes Zeichen abzurufen, übergeben Sie die ID des Zeichens an den Enpoint.
GET /api/characters/{id}
Sie können die POST-Methode zum /characters/ Endpunkt verwenden, um einen neuen Charakter zu erstellen.
POST /api/characters/
Sie müssen die folgenden Parameter in der Abfrage übergeben, um erfolgreich ein Zeichen zu erstellen:
{ "name": "string", "occupation": "string", "date_of_birth": "string", "suspect": boolean }
Parameter | Description |
---|---|
name | String value for the name of the character. |
occupation | String value for the occupation of the character. |
date_of_birth | String value for the date of brith. |
suspect | Boolean parameter. True if suspect, False if not. |
Ordering of the characters can be done by two fields as parameters: name and date_of_birth
GET /api/characters/?ordering={name / date_of_birth}
Parameter | Description |
---|---|
name | Order the results by the name field. |
date_of_birth | Order the results by the date_of_birth field. |
Additionally, you can add the parameter ascending with a value 1 or 0 to order the results in ascending or descending order.
GET /api/characters/?ordering={name / date_of_birth}&ascending={1 / 0}
Parameter | Description |
---|---|
&ascending=1 | Order the results in ascending order by passing 1 as a value. |
&ascending=0 | Order the results in descending order by passing 0 as a value. |
To filter the characters, you can use the parameters in the table below. Case insensitive.
GET /api/characters/?name={text}
Parameter | Description |
---|---|
/?name={text} | Filter the results by name. It can be any length and case insensitive. |
/?occupaton={text} | Filter the results by occupation. It can be any length and case insensitive. |
/?suspect={True / False} | Filter the results by suspect status. It can be True or False. |
You can also use the search parameter in the query to search characters and retrieve results based on the fields listed below.
GET /api/characters/?search={text}
name
occupation
date_of_birth
To update a character, you will need to pass the {id} of a character to the URL and make a PUT method request with the parameters in the table below.
PUT /api/characters/{id}
{ "name": "Mike Ehrmantraut", "occupation": "Retired Officer", "date_of_birth": "1945", "suspect": false }
Parameter | Description |
---|---|
name | String value for the name of the character. |
occupation | String value for the occupation of the character. |
date_of_birth | String value for the date of birth. |
suspect | Boolean parameter. True if suspect, False if not. |
To delete a character, you will need to pass the {id} of a character to the URL and make DELETE method request.
DELETE /api/characters/{id}
To retrieves all existing locations in the database.
GET /api/locations/
[ { "id": 1, "name": "Los Pollos Hermanos", "longitude": 35.065442792232716, "latitude": -106.6444840309555, "created": "2023-02-09T22:04:32.441106Z", "character": { "id": 2, "name": "Tuco Salamanca", "details": "http://localhost:8000/api/characters/2" } }, ]
To retrieve a single location, pass the locations ID to the endpoint.
GET /api/locations/{id}
You can use the POST method to /locations/ endpoint to create a new location.
POST /api/locations/
You will need to pass the following parameters in the query, to successfully create a location:
{ "name": "string", "longitude": float, "latitude": float, "character": integer }
Parameter | Description |
---|---|
name | The name of the location. |
longitude | Longitude of the location. |
latitude | Latitude of the location. |
character | This is the id of a character. It is basically ForeignKey relation to the Character model. |
Note: Upon creation of an entry, the Longitude and the Latitude will be converted to a PointField() type of field in the model and stored as a calculated geographical value under the field coordinates, in order for the location coordinates to be eligible for GeoDjango operations.
Ordering of the locations can be done by providing the parameters for the longitude and latitude coordinates for a single point, and a radius (in meters). This will return all of the locations stored in the database, that are in the provided radius from the provided point (coordinates).
GET /api/locations/?longitude={longitude}&latitude={latitude}&radius={radius}
Parameter | Description |
---|---|
longitude | The longitude parameter of the radius point. |
latitude | The latitude parameter of the radius point. |
radius | The radius parameter (in meters). |
Additionally, you can add the parameter ascending with values 1 or 0 to order the results in ascending or descending order.
GET /api/locations/?longitude={longitude}&latitude={latitude}&radius={radius}&ascending={1 / 0}
Parameter | Description |
---|---|
&ascending=1 | Order the results in ascending order by passing 1 as a value. |
&ascending=0 | Order the results in descending order by passing 0 as a value. |
To filter the locations, you can use the parameters in the table below. Case insensitive.
GET /api/locations/?character={text}
Parameter | Description |
---|---|
/?name={text} | Filter the results by location name. It can be any length and case insensitive. |
/?character={text} | Filter the results by character. It can be any length and case insensitive. |
/?created={timeframe} | Filter the results by when they were created. Options: today, yesterday, week, month & year. |
Note: You can combine filtering parameters with ordering parameters. Just keep in mind that if you filter by any of these fields above and want to use the ordering parameters, you will always need to pass longitude, latitude and radius altogether. Additionally, if you need to use ascending parameter for ordering, this parameter can't be passed without longitude, latitude and radius as well.
To update a location, you will need to pass the {id} of locations to the URL and make a PUT method request with the parameters in the table below.
PUT /api/locations/{id}
{ "id": 1, "name": "Los Pollos Hermanos", "longitude": 35.065442792232716, "latitude": -106.6444840309555, "created": "2023-02-09T22:04:32.441106Z", "character": { "id": 2, "name": "Tuco Salamanca", "occupation": "Grandpa Keeper", "date_of_birth": "1975", "suspect": true } }
Parameter | Description |
---|---|
name | String value for the name of the location. |
longitude | Float value for the longitude of the location. |
latitude | Float value for the latitude of the location. |
To delete a location, you will need to pass the {id} of a location to the URL and make a DELETE method request.
DELETE /api/locations/{id}
Das obige ist der detaillierte Inhalt vonJagd auf Heisenberg mit dem Django Rest Framework. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!