Maison >développement back-end >Tutoriel Python >Chasse à Heisenberg avec Django Rest Framework
L'idée était de créer une plateforme simple pour les agents de la DEA, afin de gérer les informations sur les personnages de l'univers Breaking Bad/Better Call Saul. Pour faciliter la vie des agents de la DEA, ils doivent disposer d'un point de terminaison API permettant de filtrer les informations sur les personnages par leur nom, leur date de naissance, leur profession ou s'ils sont suspects.
Alors que la DEA tente de mettre les barons de la drogue derrière les barreaux, elle les suit ainsi que les personnes autour de chez eux. Ils stockent les horodatages et les emplacements particuliers sous forme de coordonnées géographiques dans une table associée. Le point de terminaison qui exposera les données doit permettre le filtrage des entrées de localisation, qui se trouvaient à une distance spécifique d'un point géographique particulier, ainsi que la personne à qui elles ont été attribuées et la plage de dates et d'heures à laquelle elles ont été enregistrées. L'ordre de ce point final doit permettre de prendre en compte la distance par rapport à un point géographique spécifié, à la fois ascendant et descendant.
Pour voir comment cela a été réalisé, vous pouvez mettre en place ce projet localement en suivant la documentation ci-dessous et en le testant par vous-même.
Vous pouvez trouver le code dans mon référentiel GitHub ici.
Comme prérequis, vous devrez avoir Docker et docker-compose installés sur votre système.
Dans un premier temps, allez dans le dossier de votre projet et clonez le référentiel de l'API Breaking Bad :
git clone git@github.com:drangovski/breaking-bad-api.git
cd break-bad-api
Ensuite, vous devrez créer un fichier .env dans lequel vous mettrez les valeurs des variables suivantes :
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
Remarque : si vous le souhaitez, vous pouvez utiliser le fichier env_generator.sh pour créer un fichier .env pour vous. Cela générera également automatiquement le SECRET_KEY. Pour exécuter ce fichier, donnez-lui d'abord l'autorisation avec chmod x env_generator.sh, puis exécutez-le avec ./env_generator.sh
Une fois que vous avez cet ensemble, vous pouvez exécuter :
construction docker-compose
docker-composer
Cela démarrera l'application Django sur localhost:8000. Pour accéder à l'API, l'URL sera localhost:8000/api.
Par souci de la thématique de ces projets (et éventuellement, pour vous faciliter un peu la vie :)), vous pouvez éventuellement utiliser les lieux suivants et leurs coordonnées :
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)
Pour récupérer tous les caractères existants dans la base de données.
OBTENIR /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 } ]
Pour récupérer un seul personnage, transmettez l'ID du personnage à l'enpoint.
OBTENIR /api/characters/{id}
Vous pouvez utiliser la méthode POST pour /characters/ point de terminaison afin de créer un nouveau personnage.
POST /api/characters/
Vous devrez transmettre les paramètres suivants dans la requête, afin de réussir à créer un personnage :
{ "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}
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!