Heim >Backend-Entwicklung >Python-Tutorial >Jagd auf Heisenberg mit dem Django Rest Framework

Jagd auf Heisenberg mit dem Django Rest Framework

DDD
DDDOriginal
2024-10-15 22:14:02478Durchsuche

Hunting Heisenberg with Django Rest Framework

Die Idee

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.

Einrichten des Projekts

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.

Scheinstandorte

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)

Charaktere

Rufen Sie alle Charaktere ab

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
    }
]

Rufen Sie ein einzelnes Zeichen ab

Um ein einzelnes Zeichen abzurufen, übergeben Sie die ID des Zeichens an den Enpoint.

GET /api/characters/{id}

Erstelle einen neuen Charakter

Sie können die POST-Methode zum /characters/ Endpunkt verwenden, um einen neuen Charakter zu erstellen.

POST /api/characters/

Erstellungsparameter

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.

Character ordering

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.

Character filtering

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.

Character search

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

Update a character

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.

Delete a character

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}

Locations

Retrieve all locations

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"
        }
    },
]

Retrieve a single location

To retrieve a single location, pass the locations ID to the endpoint.

GET /api/locations/{id}

Create a new location

You can use the POST method to /locations/ endpoint to create a new location.

POST /api/locations/

Creation parameters

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.

Location ordering

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.

Locaton filtering

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.

Update a location

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.

Delete a 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!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn