Add the skeleton for an API app

URL handling is a hack, but it works
This commit is contained in:
Jake Howard 2022-08-22 23:26:39 +01:00
parent 10005dfe02
commit fc141c9778
Signed by: jake
GPG key ID: 57AFB45680EDD477
8 changed files with 88 additions and 10 deletions

View file

@ -17,3 +17,4 @@ djangorestframework
django-htmx django-htmx
wagtail-metadata wagtail-metadata
humanize humanize
drf-yasg

View file

@ -12,8 +12,10 @@ brotli==1.0.9 # via whitenoise
certifi==2022.6.15 # via requests certifi==2022.6.15 # via requests
charset-normalizer==2.1.0 # via requests charset-normalizer==2.1.0 # via requests
click==8.1.3 # via rq click==8.1.3 # via rq
coreapi==2.3.3 # via drf-yasg
coreschema==0.0.4 # via coreapi, drf-yasg
deprecated==1.2.13 # via redis deprecated==1.2.13 # via redis
django==4.0.6 # via -r requirements/base.in, django-filter, django-htmx, django-modelcluster, django-permissionedforms, django-redis, django-rq, django-taggit, django-treebeard, djangorestframework, wagtail django==4.0.6 # via -r requirements/base.in, django-filter, django-htmx, django-modelcluster, django-permissionedforms, django-redis, django-rq, django-taggit, django-treebeard, djangorestframework, drf-yasg, wagtail
django-environ==0.9.0 # via -r requirements/base.in django-environ==0.9.0 # via -r requirements/base.in
django-filter==21.1 # via wagtail django-filter==21.1 # via wagtail
django-htmx==1.12.1 # via -r requirements/base.in django-htmx==1.12.1 # via -r requirements/base.in
@ -23,31 +25,39 @@ django-redis==5.2.0 # via -r requirements/base.in
django-rq==2.5.1 # via -r requirements/base.in django-rq==2.5.1 # via -r requirements/base.in
django-taggit==2.1.0 # via wagtail django-taggit==2.1.0 # via wagtail
django-treebeard==4.5.1 # via wagtail django-treebeard==4.5.1 # via wagtail
djangorestframework==3.13.1 # via -r requirements/base.in, wagtail djangorestframework==3.13.1 # via -r requirements/base.in, drf-yasg, wagtail
draftjs-exporter==2.1.7 # via wagtail draftjs-exporter==2.1.7 # via wagtail
drf-yasg==1.21.3 # via -r requirements/base.in
et-xmlfile==1.1.0 # via openpyxl et-xmlfile==1.1.0 # via openpyxl
gunicorn==20.1.0 # via -r requirements/base.in gunicorn==20.1.0 # via -r requirements/base.in
html5lib==1.1 # via wagtail html5lib==1.1 # via wagtail
humanize==4.3.0 # via -r requirements/base.in humanize==4.3.0 # via -r requirements/base.in
idna==3.3 # via requests idna==3.3 # via requests
inflection==0.5.1 # via drf-yasg
itypes==1.2.0 # via coreapi
jinja2==3.1.2 # via coreschema
l18n==2021.3 # via wagtail l18n==2021.3 # via wagtail
lxml==4.9.1 # via -r requirements/base.in lxml==4.9.1 # via -r requirements/base.in
markupsafe==2.1.1 # via jinja2
more-itertools==8.13.0 # via -r requirements/base.in more-itertools==8.13.0 # via -r requirements/base.in
openpyxl==3.0.10 # via tablib openpyxl==3.0.10 # via tablib
packaging==21.3 # via redis packaging==21.3 # via drf-yasg, redis
pillow==9.2.0 # via wagtail pillow==9.2.0 # via wagtail
psycopg2==2.9.3 # via -r requirements/base.in psycopg2==2.9.3 # via -r requirements/base.in
pygments==2.13.0 # via -r requirements/base.in pygments==2.13.0 # via -r requirements/base.in
pyparsing==3.0.9 # via packaging pyparsing==3.0.9 # via packaging
pytz==2022.1 # via django-modelcluster, djangorestframework, l18n pytz==2022.1 # via django-modelcluster, djangorestframework, drf-yasg, l18n
redis==4.3.4 # via django-redis, django-rq, rq redis==4.3.4 # via django-redis, django-rq, rq
requests==2.28.1 # via -r requirements/base.in, wagtail, wagtail-generic-chooser requests==2.28.1 # via -r requirements/base.in, coreapi, wagtail, wagtail-generic-chooser
rq==1.10.1 # via django-rq rq==1.10.1 # via django-rq
ruamel-yaml==0.17.21 # via drf-yasg
ruamel-yaml-clib==0.2.6 # via ruamel-yaml
six==1.16.0 # via html5lib, l18n six==1.16.0 # via html5lib, l18n
soupsieve==2.3.2.post1 # via beautifulsoup4 soupsieve==2.3.2.post1 # via beautifulsoup4
sqlparse==0.4.2 # via django sqlparse==0.4.2 # via django
tablib[xls,xlsx]==3.2.1 # via wagtail tablib[xls,xlsx]==3.2.1 # via wagtail
telepath==0.2 # via wagtail telepath==0.2 # via wagtail
uritemplate==4.1.1 # via coreapi, drf-yasg
urllib3==1.26.11 # via requests urllib3==1.26.11 # via requests
wagtail==3.0.1 # via -r requirements/base.in, wagtail-draftail-snippet, wagtail-metadata wagtail==3.0.1 # via -r requirements/base.in, wagtail-draftail-snippet, wagtail-metadata
wagtail-draftail-snippet==0.4.1 # via -r requirements/base.in wagtail-draftail-snippet==0.4.1 # via -r requirements/base.in

View file

@ -15,10 +15,12 @@ build==0.8.0 # via pip-tools
certifi==2022.6.15 # via -r requirements/base.txt, requests certifi==2022.6.15 # via -r requirements/base.txt, requests
charset-normalizer==2.1.0 # via -r requirements/base.txt, requests charset-normalizer==2.1.0 # via -r requirements/base.txt, requests
click==8.1.3 # via -r requirements/base.txt, black, curlylint, pip-tools, rq click==8.1.3 # via -r requirements/base.txt, black, curlylint, pip-tools, rq
coreapi==2.3.3 # via -r requirements/base.txt, drf-yasg
coreschema==0.0.4 # via -r requirements/base.txt, coreapi, drf-yasg
coverage==6.4.4 # via -r requirements/dev.in coverage==6.4.4 # via -r requirements/dev.in
curlylint==0.13.1 # via -r requirements/dev.in curlylint==0.13.1 # via -r requirements/dev.in
deprecated==1.2.13 # via -r requirements/base.txt, redis deprecated==1.2.13 # via -r requirements/base.txt, redis
django==4.0.6 # via -r requirements/base.txt, django-browser-reload, django-debug-toolbar, django-filter, django-htmx, django-modelcluster, django-permissionedforms, django-redis, django-rq, django-taggit, django-treebeard, djangorestframework, wagtail django==4.0.6 # via -r requirements/base.txt, django-browser-reload, django-debug-toolbar, django-filter, django-htmx, django-modelcluster, django-permissionedforms, django-redis, django-rq, django-taggit, django-treebeard, djangorestframework, drf-yasg, wagtail
django-browser-reload==1.6.0 # via -r requirements/dev.in django-browser-reload==1.6.0 # via -r requirements/dev.in
django-debug-toolbar==3.5.0 # via -r requirements/dev.in django-debug-toolbar==3.5.0 # via -r requirements/dev.in
django-environ==0.9.0 # via -r requirements/base.txt django-environ==0.9.0 # via -r requirements/base.txt
@ -30,9 +32,10 @@ django-redis==5.2.0 # via -r requirements/base.txt
django-rq==2.5.1 # via -r requirements/base.txt django-rq==2.5.1 # via -r requirements/base.txt
django-taggit==2.1.0 # via -r requirements/base.txt, wagtail django-taggit==2.1.0 # via -r requirements/base.txt, wagtail
django-treebeard==4.5.1 # via -r requirements/base.txt, wagtail django-treebeard==4.5.1 # via -r requirements/base.txt, wagtail
djangorestframework==3.13.1 # via -r requirements/base.txt, wagtail djangorestframework==3.13.1 # via -r requirements/base.txt, drf-yasg, wagtail
djhtml==1.5.1 # via -r requirements/dev.in djhtml==1.5.1 # via -r requirements/dev.in
draftjs-exporter==2.1.7 # via -r requirements/base.txt, wagtail draftjs-exporter==2.1.7 # via -r requirements/base.txt, wagtail
drf-yasg==1.21.3 # via -r requirements/base.txt
et-xmlfile==1.1.0 # via -r requirements/base.txt, openpyxl et-xmlfile==1.1.0 # via -r requirements/base.txt, openpyxl
factory-boy==3.2.1 # via wagtail-factories factory-boy==3.2.1 # via wagtail-factories
faker==14.1.0 # via factory-boy faker==14.1.0 # via factory-boy
@ -42,15 +45,19 @@ honcho==1.1.0 # via -r requirements/dev.in
html5lib==1.1 # via -r requirements/base.txt, wagtail html5lib==1.1 # via -r requirements/base.txt, wagtail
humanize==4.3.0 # via -r requirements/base.txt humanize==4.3.0 # via -r requirements/base.txt
idna==3.3 # via -r requirements/base.txt, requests idna==3.3 # via -r requirements/base.txt, requests
inflection==0.5.1 # via -r requirements/base.txt, drf-yasg
isort==5.10.1 # via -r requirements/dev.in isort==5.10.1 # via -r requirements/dev.in
itypes==1.2.0 # via -r requirements/base.txt, coreapi
jinja2==3.1.2 # via -r requirements/base.txt, coreschema
l18n==2021.3 # via -r requirements/base.txt, wagtail l18n==2021.3 # via -r requirements/base.txt, wagtail
lxml==4.9.1 # via -r requirements/base.txt lxml==4.9.1 # via -r requirements/base.txt
markupsafe==2.1.1 # via -r requirements/base.txt, jinja2
mccabe==0.6.1 # via flake8 mccabe==0.6.1 # via flake8
more-itertools==8.13.0 # via -r requirements/base.txt more-itertools==8.13.0 # via -r requirements/base.txt
mypy==0.971 # via -r requirements/dev.in mypy==0.971 # via -r requirements/dev.in
mypy-extensions==0.4.3 # via black, mypy mypy-extensions==0.4.3 # via black, mypy
openpyxl==3.0.10 # via -r requirements/base.txt, tablib openpyxl==3.0.10 # via -r requirements/base.txt, tablib
packaging==21.3 # via -r requirements/base.txt, build, redis packaging==21.3 # via -r requirements/base.txt, build, drf-yasg, redis
parsy==1.1.0 # via curlylint parsy==1.1.0 # via curlylint
pathspec==0.9.0 # via black, curlylint pathspec==0.9.0 # via black, curlylint
pep517==0.12.0 # via build pep517==0.12.0 # via build
@ -63,10 +70,12 @@ pyflakes==2.4.0 # via flake8
pygments==2.13.0 # via -r requirements/base.txt pygments==2.13.0 # via -r requirements/base.txt
pyparsing==3.0.9 # via -r requirements/base.txt, packaging pyparsing==3.0.9 # via -r requirements/base.txt, packaging
python-dateutil==2.8.2 # via faker python-dateutil==2.8.2 # via faker
pytz==2022.1 # via -r requirements/base.txt, django-modelcluster, djangorestframework, l18n pytz==2022.1 # via -r requirements/base.txt, django-modelcluster, djangorestframework, drf-yasg, l18n
redis==4.3.4 # via -r requirements/base.txt, django-redis, django-rq, rq redis==4.3.4 # via -r requirements/base.txt, django-redis, django-rq, rq
requests==2.28.1 # via -r requirements/base.txt, wagtail, wagtail-generic-chooser requests==2.28.1 # via -r requirements/base.txt, coreapi, wagtail, wagtail-generic-chooser
rq==1.10.1 # via -r requirements/base.txt, django-rq rq==1.10.1 # via -r requirements/base.txt, django-rq
ruamel-yaml==0.17.21 # via -r requirements/base.txt, drf-yasg
ruamel-yaml-clib==0.2.6 # via -r requirements/base.txt, ruamel-yaml
six==1.16.0 # via -r requirements/base.txt, html5lib, l18n, python-dateutil six==1.16.0 # via -r requirements/base.txt, html5lib, l18n, python-dateutil
soupsieve==2.3.2.post1 # via -r requirements/base.txt, beautifulsoup4 soupsieve==2.3.2.post1 # via -r requirements/base.txt, beautifulsoup4
sqlparse==0.4.2 # via -r requirements/base.txt, django, django-debug-toolbar sqlparse==0.4.2 # via -r requirements/base.txt, django, django-debug-toolbar
@ -77,6 +86,7 @@ tomli==2.0.1 # via black, build, mypy, pep517
types-requests==2.28.5 # via -r requirements/dev.in types-requests==2.28.5 # via -r requirements/dev.in
types-urllib3==1.26.17 # via types-requests types-urllib3==1.26.17 # via types-requests
typing-extensions==4.3.0 # via mypy typing-extensions==4.3.0 # via mypy
uritemplate==4.1.1 # via -r requirements/base.txt, coreapi, drf-yasg
urllib3==1.26.11 # via -r requirements/base.txt, requests urllib3==1.26.11 # via -r requirements/base.txt, requests
wagtail==3.0.1 # via -r requirements/base.txt, wagtail-draftail-snippet, wagtail-factories, wagtail-metadata wagtail==3.0.1 # via -r requirements/base.txt, wagtail-draftail-snippet, wagtail-factories, wagtail-metadata
wagtail-draftail-snippet==0.4.1 # via -r requirements/base.txt wagtail-draftail-snippet==0.4.1 # via -r requirements/base.txt

0
website/api/__init__.py Normal file
View file

40
website/api/urls.py Normal file
View file

@ -0,0 +1,40 @@
from django.urls import include, path, re_path
from drf_yasg import openapi
from drf_yasg.views import get_schema_view
from rest_framework import permissions
from . import views
app_name = "api"
api_urlpatterns = [path("ping", views.PingAPIView.as_view(), name="ping")]
schema_view = get_schema_view(
openapi.Info(
title="Website API",
default_version="v1",
description="Random API endpoints for cool things",
),
public=True,
permission_classes=[permissions.AllowAny],
patterns=[
# HACK: Ensure the created URLs are fully-formed
path("api/", include(api_urlpatterns))
],
)
urlpatterns = [
re_path(
r"^swagger(?P<format>\.json|\.yaml)$",
schema_view.without_ui(cache_timeout=0),
name="schema-json",
),
re_path(
r"^swagger/$",
schema_view.with_ui("swagger", cache_timeout=0),
name="schema-swagger-ui",
),
re_path(
r"^redoc/$", schema_view.with_ui("redoc", cache_timeout=0), name="schema-redoc"
),
] + api_urlpatterns

12
website/api/views.py Normal file
View file

@ -0,0 +1,12 @@
from django.http.request import HttpRequest
from rest_framework.response import Response
from rest_framework.views import APIView
class PingAPIView(APIView):
"""
PONGs
"""
def get(self, request: HttpRequest) -> Response:
return Response("PONG")

View file

@ -59,6 +59,7 @@ INSTALLED_APPS = [
"generic_chooser", "generic_chooser",
"wagtail_draftail_snippet", "wagtail_draftail_snippet",
"django_rq", "django_rq",
"drf_yasg",
"django.contrib.auth", "django.contrib.auth",
"django.contrib.contenttypes", "django.contrib.contenttypes",
"django.contrib.sessions", "django.contrib.sessions",
@ -207,3 +208,6 @@ if DEBUG:
# Add Wagtail styleguide # Add Wagtail styleguide
INSTALLED_APPS.append("wagtail.contrib.styleguide") INSTALLED_APPS.append("wagtail.contrib.styleguide")
SWAGGER_SETTINGS = {"USE_SESSION_AUTH": False, "SECURITY_DEFINITIONS": {}}

View file

@ -27,6 +27,7 @@ urlpatterns = [
path("404/", page_not_found, name="404"), path("404/", page_not_found, name="404"),
path("feed/", AllPagesFeed(), name="feed"), path("feed/", AllPagesFeed(), name="feed"),
path("", include("website.legacy.urls")), path("", include("website.legacy.urls")),
path("api/", include("website.api.urls")),
] ]