Django: сохранить JSON в базу данных, используя Fetch / Post - PullRequest
0 голосов
/ 04 декабря 2018

В приложении Django я хочу сохранить JSON в базе данных, используя API fetch / post.Две проблемы: (1) у меня проблемы с проверкой CSRF, и (2) я не уверен в том, чтобы использовать POST для изменения БД в целом.

У меня есть модель "Job" с полем, которое должноHold JSON.

class Job(models.Model):
    job_id = models.IntegerField()
    setup_json = models.CharField(max_length=100000, blank=True, null=True)

JSON создается при взаимодействии пользователя на странице.Когда я нажимаю кнопку «Сохранить», я хочу записать JSON в поле setup_json правильного задания.

Я не хочу использовать форму, потому что JSON хранится в JavaScript, а не внаписано в любом месте на странице.Поэтому я получаю токен CSRF из шаблона для непосредственного использования, например:

{% csrf_token %}
<script type="text/javascript">
  const csrftoken = document.getElementsByName("csrfmiddlewaretoken")[0].value;
</script>

(Примечание: в моем файле "settings.py" я добавил строку CSRF_USE_SESSIONS = True вчтобы использовать эту технику.)

Затем моя кнопка сохранения вызывает такую ​​функцию:

function onPressSave() {
  fetch(`webapp/api/save-json/${jobId}`, {
    method: "POST",
    headers: {
      "X-Requested-With": "XMLHttpRequest",
      "X-CSRF-Token": csrftoken,
      "Content-Type": "application/json; charset=utf-8",
      Accept: "application/json"
    },
    credentials: "same-origin",
    body: JSON.stringify("test json")
  });
}

Я получаю ошибку «POST 403 (Forbidden)» в консоли.Любая помощь с этим будет принята с благодарностью!

Я также немного не уверен, как должна выглядеть функция приема.В настоящее время это выглядит так:

def save_json(request, id):
    j = Job.objects.get(job_id=id)
    j.setup_json = json.dumps(dict(name="testing"))
    return HttpResponse("OK")

В конечном итоге я хочу получить правильный JSON из запроса POST, но похоже, что я на правильном пути с этой функцией?

Ответы [ 2 ]

0 голосов
/ 04 декабря 2018

это то, что я сделал давным-давно:

$.ajax({
   type: 'POST',
   data: JSON.stringify(data),
   contentType: 'application/json',
   url: "{% url 'login_verification_view' %}",
   headers: {
       'X-CSRFToken': '{{ csrf_token }}'
   },
   success: function(j) {
       ...
       your code
   }
0 голосов
/ 04 декабря 2018

Django ORM поддерживает JSONFields для различных баз данных, например, если вы используете серверную часть mySQL, вы можете:

from django_mysql.models import JSONField
setup_json = JSONField(null=True)

или с PostGreSQL:

from django.contrib.postgres.fields import JSONField
setup_json = JSONField(null=True)

А затем с помощьюсохранить функцию вы можете:

def save_json(request, id):
    # The json you want to save, litterally a python dict {}, or list of dicts [{},{},...]
    json_to_be_saved = {}
    j = Job.objects.get(job_id=id)
    j.setup_json = json_to_be_saved
    j.save()
    return HttpResponse("OK")

О 403, возможно, в вашем файле настроек у вас нет:

CORS_ORIGIN_ALLOW_ALL = True

MIDDLEWARE = [
    'corsheaders.middleware.CorsMiddleware', # <- Added in manually, must be at the top of this list

Что понадобится вам для установки pip: pip3 install django-cors-headers

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...