in the reactjs side
const callback = (response: any, status: number) => {
console.log(response, status);
};
// onClick this will be activated
lookup("POST", "api/addbook/", callback, {
author: 1,
title: data.title, description: data.description,
});
the following view and all the views that I create returns 500 despite they actually work as they expected. They do things like "POST", "DELETE" and al API actions but
- I expect them to return the updated data(the
response
) but they don't
- and I expect them to return 200 or 201, but they don't
note: #?? when I remove the else statement the view works very fine and it return 201.
@api_view(["POST"])
@csrf_exempt
@permission_classes([IsAuthenticated])
def add_book(request):
# print({"??You cannot access body after reading from request's data stream": request.body})
payload = request.data
user = request.user
try:
author = Author.objects.get(id=payload["author"])
book = Book.objects.create(
title=payload["title"],
description=payload["description"],
added_by=user,
author=author,
)
if "who_can_see" in request.data:
print('createing a private paper')
book.who_can_see.add(author.id, *payload["who_can_see"].split(','))
#?? when I remove these else statmane the view works very fine and it return 201.
else:
print('creatig a poblic paper.')
# it automaticly add 'Ali' to who_can_see
# so I should remove it
# # i don't know why it do that automaticly
book.who_can_see.remove().all()
book.who_can_see.add(author.id)
serializer = BookSerializer(book)
return JsonResponse({'books': serializer.data}, safe=False, status=status.HTTP_201_CREATED)
except ObjectDoesNotExist as e:
return JsonResponse({'error': str(e)}, safe=False, status=status.HTTP_404_NOT_FOUND)
except Exception:
return JsonResponse({'error': 'Something terrible went wrong'}, safe=False, status=status.HTTP_500_INTERNAL_SERVER_ERROR)
# settings.py
import os
import django_heroku
from pathlib import Path
from django.conf import settings
# ?? custom rederect don't work.
# from allauth.account.adapter import DefaultAccountAdapter
# ACCOUNT_ADAPTER = 'project.users.adapter.MyAccountAdapter'
# class MyAccountAdapter(DefaultAccountAdapter):
# def get_login_redirect_url(self, request):
# path = "/accounts/{username}/"
# return path.format(username=request.user.username)
# Build paths inside the project like this: BASE_DIR / 'subdir'.
BASE_DIR = Path(__file__).resolve().parent.parent
# Quick-start development settings - unsuitable for production
# See https://docs.djangoproject.com/en/3.1/howto/deployment/checklist/
# SECURITY WARNING: keep the secret key used in production secret!
SECRET_KEY = 'itissecrtkey'
# SECURITY WARNING: don't run with debug turned on in production!
DEBUG = True
ALLOWED_HOSTS = []
# Application definition
INSTALLED_APPS = [
'api',
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
'whitenoise.runserver_nostatic', # < As per whitenoise documentation
'rest_framework',
'corsheaders',
'allauth',
'allauth.account',
'allauth.socialaccount',
'django.contrib.sites',
'allauth.socialaccount.providers.google',
]
MIDDLEWARE = [
'corsheaders.middleware.CorsMiddleware',
'django.middleware.security.SecurityMiddleware',
# 'whitenoise.middleware.WhiteNoiseMiddleware',
'whitenoise.middleware.WhiteNoiseMiddleware',
'django.contrib.sessions.middleware.SessionMiddleware',
'django.middleware.common.CommonMiddleware',
'django.middleware.csrf.CsrfViewMiddleware',
'django.contrib.auth.middleware.AuthenticationMiddleware',
'django.contrib.messages.middleware.MessageMiddleware',
'django.middleware.clickjacking.XFrameOptionsMiddleware',
]
ROOT_URLCONF = 'backend.urls'
TEMPLATES = [
{
'BACKEND': 'django.template.backends.django.DjangoTemplates',
# set template os.path
'DIRS': [os.path.join(BASE_DIR, 'build')],
'APP_DIRS': True,
'OPTIONS': {
'context_processors': [
'django.template.context_processors.debug',
'django.template.context_processors.request',
'django.contrib.auth.context_processors.auth',
'django.contrib.messages.context_processors.messages',
],
},
},
]
WSGI_APPLICATION = 'backend.wsgi.application'
# Database
# https://docs.djangoproject.com/en/3.1/ref/settings/#databases
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.sqlite3',
'NAME': BASE_DIR / 'db.sqlite3',
}
}
# Password validation
# https://docs.djangoproject.com/en/3.1/ref/settings/#auth-password-validators
AUTH_PASSWORD_VALIDATORS = [
{
'NAME': 'django.contrib.auth.password_validation.UserAttributeSimilarityValidator',
},
{
'NAME': 'django.contrib.auth.password_validation.MinimumLengthValidator',
},
{
'NAME': 'django.contrib.auth.password_validation.CommonPasswordValidator',
},
{
'NAME': 'django.contrib.auth.password_validation.NumericPasswordValidator',
},
]
# Internationalization
# https://docs.djangoproject.com/en/3.1/topics/i18n/
LANGUAGE_CODE = 'en-us'
TIME_ZONE = 'UTC'
USE_I18N = True
USE_L10N = True
USE_TZ = True
# Static files (CSS, JavaScript, Images)
# https://docs.djangoproject.com/en/3.1/howto/static-files/
STATIC_URL = '/static/'
# ---------------------------------
django_heroku.settings(locals())
CORS_ALLOW_ALL_ORIGINS = True
# CORS_URLS_REGEX = r'^/.*$'
ALLOWED_HOSTS = ['127.0.0.1', 'localhost', '', 'autodox.herokuapp.com']
# Place static in the same location as webpack build files
STATIC_ROOT = os.path.join(BASE_DIR, 'staticfiles')
STATICFILES_DIRS = [
os.path.join(BASE_DIR, './build', './static'),
]
# If you want to serve user uploaded files add these settings
MEDIA_URL = '/media/'
MEDIA_ROOT = os.path.join(BASE_DIR, 'build', 'media')
STATICFILES_STORAGE = 'whitenoise.storage.CompressedManifestStaticFilesStorage'
AUTHENTICATION_BACKENDS = [
# Needed to login by username in Django admin, regardless of `allauth`
'django.contrib.auth.backends.ModelBackend',
# `allauth` specific authentication methods, such as login by e-mail
'allauth.account.auth_backends.AuthenticationBackend',
]
SITE_ID = 1
# Provider specific settings
SOCIALACCOUNT_PROVIDERS = {
'google': {
# For each OAuth based provider, either add a ``SocialApp``
# (``socialaccount`` app) containing the required client
# credentials, or list them here:
'APP': {
'client_id': 'sdlfjdsoifuoewurou34r908ueofiweufo2',
'secret': 'lsdfoiewru32poiruowiefuweurohidfew',
'key': ''
}
}
}
DEFAULT_RENDERER_CLASSES = [
# 'rest_framework.renderers.JSONRenderer',
]
DEFAULT_AUTHENTICATION_CLASSES = [
'rest_framework.authentication.SessionAuthentication']
if DEBUG:
DEFAULT_RENDERER_CLASSES += [
'rest_framework.renderers.BrowsableAPIRenderer']
REST_FRAMEWORK = {
'DEFAULT_AUTHENTICATION_CLASSES': DEFAULT_AUTHENTICATION_CLASSES,
# 'DEFAULT_PARSER_CLASSES': DEFAULT_RENDERER_CLASSES
}
question from:
https://stackoverflow.com/questions/65857056/ajax-return-500-despite-it-functions-as-expected