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.
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.
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/url
et/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.
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
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.