这个想法
这个想法是为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}