2015-08-14 28 views
11

Ben PUT istek ve Yastık içinde multipart/form-data kullanarak Django geri kalan bir resim yüklemek çalışıyorum: PUT isteği dinlenme django çalışmayan yüklemeyin

class ABC(APIView): 
    parser_classes = (MultiPartParser,) 
    def put(self, request): 
     a = Image() 
     a.image_url = request.data["image"] 
     a.save() 

class Image(models.Model): 
     image_url = models.ImageField(upload_to='static/bills', blank=True) 

Ben bir PUT isteği ve bir talepte Çok parçalı/form-verileri. Ben şu anda 400 ile bir yanıt kodu aldığımı bildiririm:

Her nasılsa, bu şimdi kırıldı. İlk defa yazdığımda gayet iyi çalışıyordu. O zamandan beri CORS talepleri için birkaç ayar yapılandırması ekledim:

CORS_ORIGIN_ALLOW_ALL = True 

CORS_ALLOW_HEADERS = (
    'x-requested-with', 
    'content-type', 
    'accept', 
    'origin', 
    'authorization', 
    'x-csrftoken', 
    'token', 
    'x-device-id', 
    'x-device-type', 
    'x-push-id', 
    'dataserviceversion', 
    'maxdataserviceversion' 
) 
CORS_ALLOW_METHODS = (
     'GET', 
     'POST', 
     'PUT', 
     'PATCH', 
     'DELETE', 
     'OPTIONS' 
    ) 

Herhangi bir fikrin var mı?

SEÇENEKLER iste cevabı:

Access-Control-Allow-Headers → x-requested-with, content-type, accept, origin, authorization, x-csrftoken, token, x-device-id, x-device-type, x-push-id, dataserviceversion, maxdataserviceversion 
    Access-Control-Allow-Methods → GET, POST, PUT, PATCH, DELETE, OPTIONS 
    Access-Control-Allow-Origin → * 
    Access-Control-Max-Age → 86400 
    Allow → GET, POST, DELETE, HEAD, OPTIONS 
    Content-Type → application/json 
    Date → Fri, 21 Aug 2015 06:23:28 GMT 
    Server → WSGIServer/0.1 Python/2.7.6 
    Vary → Accept 
    X-Frame-Options → SAMEORIGIN 
+0

Tarayıcı isteğini sniffer'a yakalanmış olarak ekleyebilir misiniz? – Skarlinski

+0

Sniffer yok. Bu isteği yapmak için postacı kullanıyorum. –

+2

Aynı URL'ye "OPTIONS" isteği gönderebilir ve yanıtın ne olduğunu kontrol edebilir misiniz? Geçerli bir CORS hizmeti için yanıt, Access-Control-Allow-Methods, Access-Control-Allow-Origin' vb. Gibi üstbilgilerle boş bir '200 OK' cevabı olmalıdır. – activatedgeek

cevap

15

İçerik türlerini başlıklardan kaldırmak bunu çözer.

+0

Benim için de çalıştın. Neden işe yaradığı hakkında bir fikrin var mı? – Shivendra

+0

POSTMAN kullanıyorsanız, isteğin kodunu farklı dillerde görüntüleyebileceğiniz bir bölüm vardır. Bu bir ipucu gibi davranır. –

+0

benim için de çalıştı! teşekkürler adamım, ama bir soru: neden işe yaradığını biliyor musun? –

1

Genellikle tam HTML form verilerini desteklemek amacıyla bir araya FormParser ve MultiPartParser her ikisini de kullanmak isteyeceklerdir.

1

Hatanız, multipart/form-data içeriğinizin sınırının geçersiz olduğunu - özellikle None olduğunu söylüyor. Bu, tasarım gereği, bir 400 ("Hatalı İstek") yanıt kodunu döndürür. Hata, here in the django code yükseltildi.

None eşit boundary boundary seçenek isteğinizin content-type başlığında belirtilen olmadığı anlamına gelir ile bu kod dalı girin. multipart/form-data kullanıldığında ( RFC2388 olarak adlandırılır) RFC2046 belirtildiği gibi

boundarycontent-type belirtilmelidir - belirli bir bölümünde 5.1.1 çok parçalı kişiler için

içerik türü alan bir parametre, "gerektirir sınır".

Sen istek yapmak için kullandığınız kodunu kontrol etmelidir yüzden, daha önce çalışmış demek - şey boundarycontent-type belirtilmemişse demek değişmiş olmalıdır.

N.B. İsteğin kodun oluşturulduğunu, <form method="put"> is invalid HTML şeklinde olduğunu ve bu nedenle bir HTML tarafından verilen bir tarayıcı tarafından oluşturulan bir isteğin yerine GET olacağını varsayalım.

+0

İsteği yapmak için postacı kullanıyorum. –

+0

Bu tür bir istek için kullanmam gereken kıvrılma isteğini paylaşabilir misiniz? Ben çok aşina değilim ve api hakkında şüphelerim sadece curl isteği hakkında beni şaşırtıyor. –

+0

"curl -v -XPUT -H" gibi bir şey İçerik Türü: çoktan/form-veri, sınır = -------------------------- --4bf00fbcf09 "--data-binary @ test.jpg http: // ', 'sınır =' izleyen dizinin rasgele olduğu, ancak aşağıdaki verilerde oluşmaması gereken yerlerde çalışmalıdır. Görüntü verilerinizin "test.jpg" adlı bir dosyada olduğunu varsayardım, ancak ham verileri oraya eşit bir şekilde koyabilirsiniz. –

İlgili konular