質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Django

DjangoはPythonで書かれた、オープンソースウェブアプリケーションのフレームワークです。複雑なデータベースを扱うウェブサイトを開発する際に必要な労力を減らす為にデザインされました。

Python 2.7

Python 2.7は2.xシリーズでは最後のメジャーバージョンです。Python3.1にある機能の多くが含まれています。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

Q&A

解決済

1回答

5165閲覧

[Python2.7][Django]REST frameworkを使ってPOSTされたファイルを受取る方法

iarik

総合スコア101

Django

DjangoはPythonで書かれた、オープンソースウェブアプリケーションのフレームワークです。複雑なデータベースを扱うウェブサイトを開発する際に必要な労力を減らす為にデザインされました。

Python 2.7

Python 2.7は2.xシリーズでは最後のメジャーバージョンです。Python3.1にある機能の多くが含まれています。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

1グッド

1クリップ

投稿2016/11/14 02:44

編集2016/11/14 04:20

#やりたいこと
DjangoのREST frameworkを使ってAPIサーバの検証構築をしています。
現在、GETメソッドのロジックは直ぐに作ることが出来ましたが
POSTメソッドのロジックが上手く出来ません。
やりたいことは、POSTメソッドで送信されたCSVファイルを受け取りたいのですが、下記のエラーが表示されます

#実行結果とエラー画面
・GET

> curl -k "http://127.0.0.1:8000/api/v1/test" "get"

・POST

> curl -k -X POST -F "filename=@data/test.csv" "http://127.0.0.1:8000/api/v1/test" TypeError: post() takes at least 3 arguments (2 given) [14/Nov/2016 11:38:18] "POST /api/v1/test HTTP/1.1" 500 18480

(カールの指定方法が間違っている?)

#ロジック
・api01/views.py

# !/usr/bin/env python # -*- coding: utf-8 -*- from django.shortcuts import render from rest_framework.views import APIView from rest_framework.response import Response from rest_framework.parsers import FileUploadParser from api01.serializers import TestSerializer class APIClaas(APIView): parser_classes = (FileUploadParser, ) def get(self, request, format=None): return Response('get') def post(self, request, filename, format=None): post_file = request.data['file'] return Response(post_file.name)

・api01/serializers.py

from rest_framework import serializers class TestSerializer(serializers.Serializer): str = serializers.CharField(max_length=256, required=False)

・api01/urls.py

from django.conf.urls import url from . import views from rest_framework.urlpatterns import format_suffix_patterns urlpatterns = [ url(r'^test', views.APIClaas.as_view()), ] urlpatterns = format_suffix_patterns(urlpatterns)

・pj/urls.py

from django.conf.urls import include, url from django.contrib import admin urlpatterns = [ url(r'^api/v1/', include('api01.urls')), url(r'^admin/', admin.site.urls), ]

・pj/settings.py

<省略> REST_FRAMEWORK = { # Use Django's standard `django.contrib.auth` permissions, # or allow read-only access for unauthenticated users. 'DEFAULT_PERMISSION_CLASSES': [ 'rest_framework.permissions.AllowAny' ], 'DEFAULT_PARSER_CLASSES': [ 'rest_framework.parsers.FileUploadParser' ] }
uw05091👍を押しています

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

自己解決

すみません。自己解決しました。
まず、curlコマンドでのPOST方法が駄目でした。
正しくは以下の通りです。ヘッダーにファイルネームを付与する必要があり、これは公式ドキュメントにも記載がありました。
http://www.django-rest-framework.org/api-guide/parsers/#fileuploadparser

curl -k -X POST -F "filename=@data/test.csv" -H "Content-Disposition: attachment; filename=test.csv" "http://127.0.0.1:8000/api/v1/test"

次にviews.pyの「def post(self, request, filename, format=None):」の「filename」が不要でした。
ただ、公式ドキュメントでは関数の引数に「filename」を指定していたので、どういう場合だと使えるのかは解決出来ておりません。。。。
もしご存じの方がいたらコメント頂けると幸いです

def post(self, request, format=None): post_file = request.data['file'] question_relevance = csv.reader(post_file) return Response(post_file.name)

POST結果

> curl -k -X POST -F "filename=@data/test.csv" -H "Content-Disposition: attachment; filename=test.csv" "http://127.0.0.1:8000/api/v1/test" "test.csv"

投稿2016/11/14 05:32

iarik

総合スコア101

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問