Не сохраняйте этот запрос http в базе данных на django - PullRequest
0 голосов
/ 15 ноября 2018

Клиент: Я отправляю свое сообщение на django

import requests
payload = {'datax':['12', '15'], 'datay':['22', '23'], 'timestamp':['1', '2'], 'data':['20', '19'], 'timestamp1':['1', '2'], 'mission':['Mission01', 'Mission01']}
r = requests.post("http://127.0.0.1:8000", data=payload)

Сервер (Django): Я получаю сообщение http от клиента и сохраняю данные в базе данных.Это мои модели home / models.py

from django.db import models

class Mission(models.Model):
    name = models.CharField(max_length=250)
    description = models.CharField(max_length=1000)
    type = models.CharField(max_length=500)
    date = models.DateField()

    def __str__(self):
        return self.name + '-' + self.description

class SensorLog (models.Model):
    mission = models.ForeignKey(Mission, on_delete=models.CASCADE)
    data = models.CharField(max_length=50)
    timestamp = models.CharField(max_length=50)

class PositionLog(models.Model):
    mission = models.ForeignKey(Mission, on_delete=models.CASCADE)
    datax = models.CharField(max_length=50)
    datay = models.CharField(max_length=50)
    timestamp = models.CharField(max_length=50)

это мои представления home / view.py

from django.shortcuts import render
from django.http import Http404, HttpResponse
from django.views.decorators.csrf import csrf_exempt
from .models import Mission, SensorLog, PositionLog

@csrf_exempt
def home(request):
    if request.method == 'POST':
        data = request.POST.getlist('datax')
        datass = request.POST.getlist('datay')
        timestampss = request.POST.getlist('timestamp')
        datas = request.POST.getlist('data')
        timestamps = request.POST.getlist('timestamp1')
        missions = request.POST.getlist('mission')
        for i in range(len(data)):
            mission = Mission.objects.get(name=missions[i])
            post1 = PositionLog.objects.create(datax=data[i], datay=datass[i], timestamp=timestampss[i], mission=mission)
            post = SensorLog.objects.create(data=datas[i], timestamp=timestamps[i], mission=mission)
    return HttpResponse()

def index(request):
    all_mission = Mission.objects.all()
    context = {'all_mission': all_mission}
    return render(request, 'mission/index.html', context)

def detail(request, mission_id):
    try:
        mission = Mission.objects.get(pk=mission_id)
    except Mission.DoesNotExist:
        raise Http404("Mission dose not exist")
    return render(request, 'mission/detail.html', {'mission': mission})

my urls.py

from django.contrib import admin
from django.urls import path, include
from home import views

urlpatterns = [
    path('admin/', admin.site.urls),
    path('', views.home, name ='home'),
    path('mission/', include('home.urls'))
]

и это вмои URL в моем доме / urls.py

from django.conf.urls import url
from . import views

urlpatterns = [

    #/mission/
    url(r'^$', views.index, name='index'),

    #/mission/712/
    url(r'(?P<mission_id>[0-9]+)/$', views.detail, name='detail'),
]

Я получаю сообщение http, но не сохраняю данные.у меня есть ("POST / HTTP / 1.1" 200 0) почему бы не сохранить данные?где моя ошибка?

1 Ответ

0 голосов
/ 18 ноября 2018

Проблема здесь в том, что вы передаете списки значений в качестве полезной нагрузки requests.post(), но множественные значения не должны передаваться таким образом при регулярной форме закодированных почтовых запросов.Квадратные скобки не переводятся в списки к тому времени, когда данные достигают представления.

Если вы хотите сохранить ту же структуру данных, вам нужно переключиться на отправку полезной нагрузки в виде JSON, указав json аргумент:

r = requests.post("http://127.0.0.1:8000", json=payload)  # Use json 

По вашему мнению, вам необходимо загрузить полезную нагрузку JSON и извлечь каждый список с регулярным get():

import json

@csrf_exempt
def home(request):
    if request.method == 'POST':
        # Load the JSON payload
        payload = json.loads(request.body)

        # Retrieve the lists
        data = payload.get('datax')
        datass = payload.get('datay')
        timestampss = payload.get('timestamp')
        datas = payload.get('data')
        timestamps = payload.get('timestamp1')
        missions = payload.get('mission')
        ...
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...