16.9. HTTP CORS
CORS in 100 Seconds: https://www.youtube.com/watch?v=4KHiSt0oLJ0
16.9.1. OPTIONS and CORS
http_method_names = ['get', 'post', 'options']
def options(self, request, *args, **kwargs):
response = HttpResponse(status=200)
response['Access-Control-Allow-Origin'] = '*'
response['Access-Control-Allow-Methods'] = ', '.join(http_method_names).upper()
response['Access-Control-Allow-Headers'] = 'Content-Type'
return response
16.9.2. Use Case - 1
import datetime
import json
from http import HTTPStatus
from django.db import IntegrityError
from django.http import HttpResponse, JsonResponse
from django.views.generic import View
class APIv3(View):
http_method_names = ['get', 'post', 'options']
def options(self, request, *args, **kwargs):
response = HttpResponse(status=200)
response['Access-Control-Allow-Origin'] = '*'
response['Access-Control-Allow-Methods'] = ', '.join(self.http_method_names).upper()
response['Access-Control-Allow-Headers'] = 'Content-Type'
return response
def get(self, request, *args, **kwargs):
response = JsonResponse(data={})
response['Access-Control-Allow-Origin'] = '*'
response['Cache-Control'] = 'no-cache, no-store, must-revalidate'
try:
start_datetime = datetime.datetime.strptime(request.GET['start_datetime'], '%Y-%m-%dT%H:%M:%S.%fZ').replace(tzinfo=datetime.timezone.utc)
result = Result.objects.filter(start_datetime=start_datetime)[0]
return JsonResponse(status=200, data=result.get_data())
except (Result.DoesNotExist, IndexError):
response['status'] = 404
response['data'] = {'code': 404, 'status': 'Not Found', 'message': 'Result Does Not Exists'}
return response
def post(self, request, *args, **kwargs):
response = JsonResponse(data={})
response['Access-Control-Allow-Origin'] = '*'
response['Cache-Control'] = 'no-cache, no-store, must-revalidate'
try:
data = json.loads(str(request.body, encoding='utf-8'), object_hook=json_datetime_decoder)
response['status'] = HTTPStatus.CREATED
response['data'] = {'message': 'Result added to the database.'}
return response
except IntegrityError:
response['status'] = HTTPStatus.OK
response['data'] = {'message': 'Response already uploaded'}
return response
except Exception as message:
response['status'] = HTTPStatus.BAD_REQUEST
response['data'] = {'message': 'Bad Request'}
return response