与Django休息框架一起狩猎海森堡
#python #django #api #djangorestframework

这个想法

这个想法是为DEA代理创建一个简单的平台,以管理Breaking Bad/Better Call Saul Universe中有关角色的信息。为了使DEA特工的生活更轻松,他们需要具有一个API端点,该端点允许通过其名称,出生日期,职业或是否是可疑的事实来过滤有关人物的信息。

当DEA试图将毒lord放在监狱中时,他们正在跟踪他们和他们所在的位置。他们将时间戳和特定位置作为地理坐标存储在相关表中。终点将揭示数据所需的终点,以允许滤波位置条目(距特定地理点的特定距离,以及分配给谁的特定距离以及记录何时的日期时间范围)。该端点的排序应允许考虑距指定地理位点的距离,无论是上升还是下降。

要查看如何完成,您可以通过遵循以下文档并自己测试的本地设置此项目。

您可以在我的github存储库here中找到代码。

设置项目

作为先决条件,您需要拥有 docker docker-compose

首先,请转到您的项目文件夹,然后克隆Breaking Bad API存储库:

git clone git@github.com:drangovski/breaking-bad-api.git

cd breaking-bad-api

然后,您需要创建和.env文件,以便将以下变量的值放在其中:

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

注意:如果需要,可以使用 env_generator.sh 文件为您创建.env文件。这也将自动生成 secret_key 。要运行此文件,请首先使用CHMOD +X env_generator.sh允许它,然后使用./ env_generator.sh

运行它。

拥有此组后,您可以运行:

docker-compose build

docker-compose up

这将在localhost:8000启动Django应用程序。要访问API,URL将为localhost:8000/api

模拟位置

为了这些项目的主题(最终,为了使您的生活更轻松:)),您最终可以使用以下位置及其坐标:

位置 经度 纬度
兄弟鸡 35.06534619552971 -106.64463423464572
沃尔特白宫 35.12625330483283 -106.53566597939896
扫罗·古德曼办公室 35.12958969793146 -106.53106126774908
Mike Ehrmantraut House 35.08486667169461 -106.64115047513016
杰西·平克曼之家 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)

人物

检索所有字符

检索数据库中的所有现有字符。

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

取回单个角色

要检索一个字符,请将角色的ID传递到enpoint。

GET /api/characters/{id}

创建一个新角色

您可以将邮政方法用于/cartar/端点以创建新字符。

POST /api/characters/

创建参数

您需要在查询中传递以下参数,以便成功创建一个字符:

{
    "name": "string",
    "occupation": "string",
    "date_of_birth": "string",
    "suspect": boolean
}
参数 描述
名称 字符的字符串值。
职业 字符的字符串值。
date_of_birth Brith的日期的字符串值
可疑 布尔参数。如果怀疑,则为false,如果不是。

角色排序

字符的订购可以通过两个字段作为一个参数完成: name date_of_birth

GET /api/characters/?ordering={name / date_of_birth}

参数 描述
名称 按名称字段订购结果。
date_of_birth 按date_of_birth字段订购结果。

此外,您可以添加参数 appending 带有值 1 0 以序列或降序订购结果。

GET /api/characters/?ordering={name / date_of_birth}&ascending={1 / 0}

参数 描述
&apring = 1 通过将 1 作为值以上顺序排序结果。
&apring = 0 通过将 0 作为值以降序顺序排序结果。

角色过滤

要过滤字符,您可以使用下表中的参数。病例不敏感。

GET /api/characters/?name={text}

参数 描述
/?name = {text} 按名称过滤结果。它可以是任何长度和情况不敏感的。
/?uccutaton = {text} 通过职业过滤结果。它可以是任何长度和情况不敏感的。
/?suspect = {true/false} 通过可疑状态过滤结果。可能是真实的。

角色搜索

您还可以在查询中使用搜索参数,以根据下面列出的字段搜索字符并检索结果。

GET /api/characters/?search={text}

  • 名称
  • 职业
  • date_of_birth

更新字符

要更新字符,您需要将字符的{id}传递给URL,并在下表中使用参数进行PUT方法请求。

PUT /api/characters/{id}

示例身体

{
    "name": "Mike Ehrmantraut",
    "occupation": "Retired Officer",
    "date_of_birth": "1945",
    "suspect": false
}
参数 描述
名称 字符的字符串值。
职业 字符的字符串值。
date_of_birth Brith的日期的字符串值
可疑 布尔参数。如果怀疑,则为false,如果不是。

删除角色

要删除字符,您需要将字符的{id}传递给URL并进行删除方法请求。

DELETE /api/characters/{id}

位置

检索所有位置

检索数据库中的所有现有位置。

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

检索一个位置

要检索一个位置,请将位置的ID传递到enpoint。

GET /api/locations/{id}

创建一个新位置

您可以使用邮政方法到/locations/端点以创建新位置。

POST /api/locations/

创建参数

您需要在查询中传递以下参数,以便成功创建一个位置:

{
    "name": "string",
    "longitude": float,
    "latitude": float,
    "character": integer
}
参数 描述
名称 位置的名称。
经度 位置的经度。
纬度 位置的纬度。
字符 这是字符的ID。它基本上是与角色模型的关系。

注意:创建条目后,经度和纬度将转换为模型中的端口()字段类型,并将其存储为field coordinates下的计算地理值,以使位置坐标为有资格参加Geodjango操作。

位置排序

可以通过为单个点的经度和纬度坐标提供参数来完成位置的排序,而半径(以米为单位)。这将返回数据库中存储的所有点,这些点位于提供的点(坐标)中。

GET /api/locations/?longitude={longitude}&latitude={latitude}&radius={radius}

参数 描述
经度 半径点的经度参数。
纬度 半径点的纬度参数。
半径 半径参数(以米为单位)。

此外,您可以添加参数 appending 带有值 1 0 以序列或降序订购结果。

GET /api/locations/?longitude={longitude}&latitude={latitude}&radius={radius}&ascending={1 / 0}

参数 描述
&apring = 1 通过将 1 作为值以上顺序排序结果。
&apring = 0 通过将 0 作为值以降序顺序排序结果。

Locaton过滤

要过滤位置,您可以使用下表中的参数。病例不敏感。

GET /api/locations/?character={text}

参数 描述
/?name = {text} 按位置名称过滤结果。它可以是任何长度和情况不敏感的。
/?farne = {text} 按字符过滤结果。它可以是任何长度和情况不敏感的。
/?create = {timeframe} 创建结果时,通过它们过滤结果。选项:今天,昨天,周,月和年。

注意:您可以将过滤参数与订购参数相结合。请记住,如果您通过上面的任何一个字段过滤并想要使用订购参数,则始终需要完全通过经度,纬度和半径。另外,如果您需要使用升序参数进行订购,则不能在经度,纬度和半径的情况下通过此参数。

更新位置

要更新位置,您需要将位置的{id}传递给URL,并在下表中使用参数进行PUT方法请求。

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
    }
}
参数 描述
名称 位置名称的字符串值。
经度 位置经度的浮点值。
纬度 位置纬度的浮点值。

删除位置

要删除位置,您需要将位置的{id}传递给URL并进行删除方法请求。

DELETE /api/locations/{id}