web-dev-qa-db-fra.com

Django POST erreur URL

J'essaye de faire un REST Api dans Django en sortant Json. J'ai des problèmes si je fais un POST demande en utilisant curl dans le terminal. L'erreur que j'obtiens est

Vous avez appelé cette URL via POST, mais l'URL ne se termine pas par une barre oblique et vous avez défini APPEND_SLASH. Django ne peut pas rediriger vers l'URL de barre oblique tout en conservant les données POST. Modifiez votre formulaire pour qu'il pointe vers 127.0.0.1:8000/add/ (notez le barre oblique) ou définissez APPEND_SLASH = False dans vos paramètres Django.

Mon url.py est

    from Django.conf.urls.defaults import patterns, include, url
import search

# Uncomment the next two lines to enable the admin:
# from Django.contrib import admin
# admin.autodiscover()

urlpatterns = patterns('',

    url(r'^query/$', 'search.views.query'),
    url(r'^add/$','search.views.add'),
)

et mes vues sont

# Create your views here.
from Django.http import HttpResponse
from Django.template import Context,loader
import memcache
import json

def query(request):
    data=['a','b']

    mc=memcache.Client(['127.0.0.1:11221'],debug=0)
    mc.set("d",data);

    val=mc.get("d")

    return HttpResponse("MEMCACHE: %s<br/>ORIGINAL: %s" % (json.dumps(val),json.dumps(data)) )

def add(request):
    #s=""
    #for data in request.POST:
    #   s="%s,%s" % (s,data)
    s=request.POST['b']
    return HttpResponse("%s" % s)

Je sais que ça ne donne pas Json mais j'ai le problème mentionné ci-dessus quand je fais une demande POST dans le terminal

curl http://127.0.0.1:8000/add/ -d b=2 >> output.html

Je suis nouveau pour Django cependant.

19
Zabi

Tout d'abord, assurez-vous d'envoyer la demande à http://127.0.0.1/add/ ne pas http://127.0.0.1/add.

Deuxièmement, vous pouvez également exempter la vue du traitement csrf en ajoutant le @csrf_exempt décorateur - puisque vous n'envoyez pas le jeton approprié depuis cURL.

30
Burhan Khalid

Pour la cohérence des URL, Django a un paramètre appelé APPEND_SLASH, qui ajoute toujours une barre oblique à la fin de l'URL si elle n'a pas été envoyée de cette façon pour commencer. Cela garantit que /my/awesome/url/ est toujours diffusé à partir de cette URL au lieu des deux /my/awesome/urlet/my/awesome/url/.

Cependant, Django le fait en redirigeant automatiquement la version sans la barre oblique à la fin vers celle avec la barre oblique à la fin. Les redirections ne portent pas l'état de la demande avec elles, donc quand cela se produit vos données POST sont supprimées.

Tout ce que vous devez faire est de vous assurer que lorsque vous envoyez votre POST, vous l'envoyez à la version avec la barre oblique à la fin.

21
Chris Pratt

POUR OBTENIR ==> http://127.0.0.1:8000/create?name=wpwqekhqw/

Pour POST ==> http://127.0.0.1:8000/create/?name=wpwqekhqw/

Vous devez ajouter '/' après la création dans POST ... request

1

Un autre scénario peut générer l'erreur exacte, non liée à la solution csrf ou APPEND_SLASH, sous un exemple.

 def post(self, request, *args, **kwargs):
        data= request.data
        print(data['x'])

Si 'x' n'existe pas dans le corps de la charge utile, les données ['x'] déclencheront une erreur, cette erreur dans mon cas a donné un faux message comme celui ci-dessus. Espérons que cela aidera d'autres développeurs.

0
Feras