2016-06-30 2 views
1

Я использую django 1.9.Использование curl для отправки данных в django 1.9 form

У меня есть форма, которая использует следующие поля:

class UploadFileForm(forms.Form): 
    component = forms.ChoiceField(choices=[(int(x.id), x.name) for x in Component.objects.all()]) 
    title = forms.CharField(max_length=200) 
    notes = forms.CharField(max_length=2000, widget=forms.Textarea(attrs={'rows': 5})) 
    file = forms.FileField() 

я могу использовать форму идеально, когда я к нему доступ из браузера.

Но когда я пытаюсь использовать локон, чтобы заполнить форму, я получаю ошибку «Это поле обязательно»

<ul class="errorlist"><li>This field is required.</li></ul> 
<p><label for="id_title">Title:</label> <input id="id_title" maxlength="200" name="title" type="text" /></p> 
<ul class="errorlist"><li>This field is required.</li></ul> 
<p><label for="id_notes">Notes:</label> <textarea cols="40" id="id_notes" maxlength="2000" name="notes" rows="5"> 
</textarea></p> 
<ul class="errorlist"><li>This field is required.</li></ul> 
<p><label for="id_file">File:</label> <input id="id_file" name="file" type="file" /></p> 
     <button type="submit"> upload file</button> 

Мои csrdmiddlewaretoken в настоящее время принимаются должным образом, как я могу видеть, что в выход ответа.

Вот различные запросы локон я пытался:

`curl <url> \ 
-X POST -H "Content-Type: application/json" \ 
-H "Accept: text/html,application/json" \ 
-H "X-CSRFToken: <token grabbed from form page source>" \ 
-H "Cookie: csrftoken=<token grabbed from form page source>" \ 
-d 'title=testCurl'` 

`curl <url> \ 
-X POST -H "Content-Type: application/json" \ 
-H "Accept: text/html,application/json" \ 
-H "X-CSRFToken: <token grabbed from form page source>" \ 
-H "Cookie: csrftoken=<token grabbed from form page source>" \ 
-F 'title=testCurl'` 

`curl <url> \ 
-X POST -H "Content-Type: application/json" \ 
-H "Accept: text/html,application/json" \ 
-H "X-CSRFToken: <token grabbed from form page source>" \ 
-H "Cookie: csrftoken=<token grabbed from form page source>" \ 
-d '{"title":"testCurl"}'` 

Как только это работает, мне нужно найти способ, чтобы передать файл в поле файла.

Может ли кто-нибудь помочь мне с этим?

----- редактирует: На основании предложения от @ohrstrom:

Я вижу следующее, когда я делаю «копию как завиток» из инструментов разработчика Chrome.

curl 'http://localhost:8000/releases/binary_upload' -H 'Cookie: JSESSIONID=84666B9EE0BB747F04AC3179FEB78F65; csrftoken=E50JjoNz1qigYUehGdxPjnsscCNaFslu' -H 'Origin: http://localhost:8000' -H 'Accept-Encoding: gzip, deflate' -H 'Accept-Language: en-US,en;q=0.8' -H 'Upgrade-Insecure-Requests: 1' -H 'User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_11_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/51.0.2704.103 Safari/537.36' -H 'Content-Type: multipart/form-data; boundary=----WebKitFormBoundaryn3n6mrAf19RXCh3A' -H 'Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8' -H 'Cache-Control: max-age=0' -H 'Referer: http://localhost:8000/releases/binary_upload' -H 'Connection: keep-alive' -H 'DNT: 1' --data-binary $'------WebKitFormBoundaryn3n6mrAf19RXCh3A\r\nContent-Disposition: form-data; name="csrfmiddlewaretoken"\r\n\r\nE50JjoNz1qigYUehGdxPjnsscCNaFslu\r\n------WebKitFormBoundaryn3n6mrAf19RXCh3A\r\nContent-Disposition: form-data; name="component"\r\n\r\n13\r\n------WebKitFormBoundaryn3n6mrAf19RXCh3A\r\nContent-Disposition: form-data; name="title"\r\n\r\ntest1\r\n------WebKitFormBoundaryn3n6mrAf19RXCh3A\r\nContent-Disposition: form-data; name="notes"\r\n\r\ntest123\r\n------WebKitFormBoundaryn3n6mrAf19RXCh3A\r\nContent-Disposition: form-data; name="file"; filename="Topology_Components.png"\r\nContent-Type: image/png\r\n\r\n\r\n------WebKitFormBoundaryn3n6mrAf19RXCh3A--\r\n' --compressed 

Но когда я выполнить ту же команду из терминала, он говорит: «Представленный файл пуст»

======== ======== Final Редактировать Найдено решение. Добавьте его к ответам ниже.

Если вам нужно больше деталей реализации, вы можете найти его на https://github.com/kiran-vemuri/DevServe

+0

Вы не отсылают данные формы, поэтому ошибки. См. [Этот вопрос] (http: // superuser.com/questions/149329/what-is-the-curl-command-line-syntax-to-do-a-post-request) для отправки данных формы с помощью curl. – solarissmoke

+0

Пожалуйста, покажите представление. Вы обрабатываете JSON? Если нет, почему вы отправляете JSON? –

+0

Чтобы легко получить команду curl: отправьте форму через браузер (хром) с открытыми инструментами разработчика. Затем вы можете щелкнуть правой кнопкой мыши запрос и выбрать «copy in curl». – ohrstrom

ответ

0

Вместо непосредственного отправки POST запрос на веб-форму. В настоящее время я реализую django-restframework.

С viewsets для всех типов HTTP-запросов я добавил дополнительную обработку файлов, и теперь я могу использовать следующий вызов REST для отправки данных с помощью curl.

` 
curl -H "Content-Disposition: attachment;" \ 
-X POST \ 
-F "name=test_file" \ 
-F "component_id=14" \ 
-F "notes=Hello World how are you.." \ 
-F "[email protected]<path-to-file>" http://localhost:8000/rest/binaries/ 
` 
0

полей формы в Django требуются по умолчанию:

https://docs.djangoproject.com/en/1.9/ref/forms/fields/#required

Вы только посылая «название» поле в данных, и это единственное поле, не дающее ошибки.

Либо отправьте все поля формы в данных, которые вы отправляете, или сделайте необходимые поля = False.

class UploadFileForm(forms.Form): 
    component = forms.ChoiceField(required=False, choices=[(int(x.id), x.name) for x in Component.objects.all()]) 
    title = forms.CharField(max_length=200) 
    notes = forms.CharField(required=False, max_length=2000, widget=forms.Textarea(attrs={'rows': 5})) 
    file = forms.FileField(required=False) 
+0

Первоначально я начал отправлять все поля. После просмотра ошибки во всех полях я начал отправлять только поле заголовка, чтобы проверить, могу ли я найти способ для устранения ошибки. И если вы заметили выведенный выше вывод, вы также можете увидеть ошибку в поле заголовка. –

0

Я использовал для передачи только данных и ее ценности, так что я использовал это много всего:

curl http://127.0.0.1:8000/api/ \ 
-H "Accept: application/json" \ 
-d '{"name":"testcurl","ph":"123456789"}' 
Смежные вопросы