2017-12-19 2 views
0

Ich versuche, den Benutzer x-und y-Koordinaten aus einem Bild mit cropper.js auswählen und die Daten mit Ajax zur nächsten Ansicht übergeben. Ich benutze Django 1.9.4. Ich werde auch nicht wirklich mit Javascript geübt, der Javascript Teil wird nicht von mir geschrieben.Django Ajax POST leer Fehler 500

Mit der Registerkarte Firefox Dev Tools Network scheint es einen internen Serverfehler von 500 zu bekommen. In der Ansicht "Entwicklungstools" enthält die Anforderung die erforderlichen JSON-Daten. Django scheint die Anfrage jedoch nicht korrekt zu bearbeiten. Warum?

relevanten Teil von views.py:

def render_stl(request): 
    print("Got to STL render") 
    if request.method == 'POST': 
     print("BELOW DATA") 
     print(request.POST) # <QueryDict: {}> 
     print(request.is_ajax()) # False 
     print(request.POST.__dict__) # {'_encoding': 'utf-8', '_mutable': False} 

     # This is old from a former version, but should be updated if ajax works 
     x_start = request.POST.get("x_start") 
     z_start = request.POST.get("z_start") 
     x_end = request.POST.get("x_end") 
     z_end = request.POST.get("z_end") 

     print(x_start, z_start, x_end, z_end) 
     run_stl_render(x_start, z_start, x_end, z_end) 

     # os.chdir(settings.MEDIA_ROOT) 
     stl_file = open(settings.MEDIA_ROOT + "/mySTL.stl", "r") 
     django_file = File(stl_file) 


     return render(request, 'img_crop/render_stl.html', {'django_file': django_file}) 

urls.py:

urlpatterns = [ 
    url(r'^$', views.index, name='index'), 
    url(r'^render_img$', views.upload_file, name='render_img'), 
    url(r'^render_stl$', views.render_stl, name='render_stl'), 
    url(r'^download_stl$', views.download_stl, name='download_stl'), 
    # url(r'^media/mySTL.stl', 'django.views.static.serve', {'document_root': settings.MEDIA_ROOT}), 

]

Javascript (die csrftoken in einer anderen Funktion definiert ist):

sendDataOfCroppedImage = function(dataOfCroppedImage) { 
    // var data = 'data : [' + JSON.stringify(dataOfCroppedImage) + ']'; 
    var data_s = JSON.stringify(dataOfCroppedImage); 
    console.log('data',data_s); 
     $.ajax({ 
      async: true, 
      crossDomain: true, 
      method: 'POST', 
      data: data_s, 
      dataType: 'json', 
      headers: { 
       'HTTP_X_REQUESTED_WITH': 'XMLHttpRequest', 
       'content-type': 'application/json', 
       'cache-control': 'no-cache', 
       'X-CSRFToken': csrftoken 
      }, 
      url: 'render_stl', 
      success: function() { 
       console.log('sendDataOfCroppedImage okay'); 
      } 
     }); 
    }, 

Die Temp spät:

<html> 
{% load staticfiles %} 
<head> 
<title> 
Your rendered image 
</title> 
<script src="{% static 'img_crop/js/jquery-3.2.1.js' %}"></script> 
<script src="{% static 'img_crop/js/cookie.js' %}"></script> 
<script src="{% static 'img_crop/js/cropper.js' %}"></script> 

<link href="{% static 'img_crop/css/cropper.css' %}" rel="stylesheet"> 
<style> 
    #image { 
     max-width: 100%; 
    } 
</style> 
</head> 
<body> 
<h1>Hier ist das generierte Bild aus Ihrer Welt!</h1> 
<h2>Wählen Sie nun Ihren Bereich aus: </h2> 

<div style="overflow: hidden; width: 400px; height: calc(400px/16 * 9);"> 
<div> 
    <img id="image" src="{% static "img_crop/MC2px.png" %}" alt="Rendered image"/> 
</div> 
</div> 

<button id="getDataBtn" class="button get-data">Submit Choice</button> 
+0

Sie sollen Antwort in Ihrer Ansicht zurückgeben, aber Sie keine Antwort zurückgeben. Eine weitere Sache, wenn Sie eine Anfrage anders als ** POST ** Anfrage an Ihre Ansicht senden, dann gibt es auch nichts kehrt zurück. In diesem Fall geben Sie etwas wie Http404 oder NotImplemented etc. zurück. –

+0

Ich gebe eine Antwort zurück, habe sie nicht eingeschlossen, da die Funktion irgendwie lang ist, wird aktualisiert. – Torben545

Antwort

0

request.POST ist nur für formularbasierte Daten. Wenn Sie json-codierte Daten senden, sollten Sie stattdessen auf request.body zugreifen.

data = json.loads(request.body.decode('utf-8')) 

Wenn Sie einen 500-Fehler mit DEBUG = True bekommen, dann sollten Sie in der Lage sein, den Rückverfolgungs mit Ihrem Browser Entwickler-Tools zu sehen. Wenn DEBUG=False, dann suchen Sie in Ihren Protokollen oder in der Fehler-E-Mail, die an die Site-Administratoren gesendet wurde.

+0

funktioniert perfekt, danke! – Torben545