1

models.FileField フィールドと、ファイルをサーバーにアップロードするために使用されるフォームを持つ django ファイル モデルがあります。

class UploadFile(model.Model):
    filename = models.FileField(upload_to='uploads')
    description = models.CharField(max_length=38, blank=True)

class UploadFileForm(ModelForm):
    class Meta:
        model = UploadFile
        fields = ('filename', 'description')

ビュー関数は次のようになります。

def upload_file(request):
    if request.method == 'POST':
        form = UploadFileForm(request.POST, request.FILES)
        if form.is_valid():
            new_file = form.save()

ここで、標準ライブラリのみを使用して、上記のビュー関数を使用して UploadFile モデルにファイルをアップロードする Python スクリプトが必要です。ただし、POST 要求には FILES メソッドがないため、このコードは機能しません。

import urllib, urllib2
data = urllib.urlencode({'filename': open(uploadfile, "rb"),
                        'description': 'upload test'})
post_req = urllib2.Request(upload_file_url, data)
result = urllib2.urlopen(post_req)

POST リクエストに FILES メソッドを追加して、Python スクリプトを使用してファイルをアップロードするにはどうすればよいですか? また、フォームを使用しない別のビュー関数を作成しようとしましたが、どちらも機能していません。

4

2 に答える 2

6

django ビューが機能するかどうかを確認するには、ブラウザーを使用してテストできます。

<FORM action="{{ upload_file_url }}"
      enctype="multipart/form-data"
      method="POST">
  Description: <INPUT type="text" name="description" value="upload test"><BR>
  File to upload: <INPUT type="file" name="filename"><BR>
  <INPUT type="submit" value="Send">
</FORM>

stdlib のみを使用してプログラムで複製するのは複雑です。

librarymultipart/form-dataを使用できるようにファイルをアップロードするには:requests

import requests

response = requests.post(upload_file_url,
                         files={'filename': open(uploadfile,'rb'),
                                'description': 'upload test'})
print response.content

またはurllib2ライブラリposter:

import urllib2

import poster.encode
import poster.streaminghttp

opener = poster.streaminghttp.register_openers()

params = {'filename': open(uploadfile,'rb'), 'description': 'upload test'}
datagen, headers = poster.encode.multipart_encode(params)
response = opener.open(urllib2.Request(upload_file_url, datagen, headers))
print response.read()
于 2013-06-06T18:12:06.230 に答える