2

UUID でキーを設定したいオブジェクトを作成するプロジェクトがあります。manage.py のシンプルな Django テスト サーバーでこのプロジェクトを実行すると、すべてうまくいきます。しかし、私はherokuにデプロイしようとしているので、コードを壊すgunicornサーバーでvirtualenvをセットアップしました。このサーバーで実行すると、何らかの理由で UploadedFile オブジェクトに常に空白のアクセスリンクがあるという事実にエラーを追跡しました。

これが私のmodels.pyのコードです:

 from django.db import models
 import uuid
 import datetime

 # UUID field will be used to key file upload objects
 class UUIDField(models.CharField) :
   def __init__(self, *args, **kwargs):
     kwargs['max_length'] = kwargs.get('max_length', 64 )
     kwargs['blank'] = True
     models.CharField.__init__(self, *args, **kwargs)

 class UploadedFile(models.Model):
   #accessLink = UUIDField(primary_key=True, editable=False)
   accessLink = models.CharField(primary_key=True, max_length=64)
   uploadTime = models.DateTimeField(default=datetime.datetime.now)  
   filename = models.CharField(max_length=200)

   def __init__(self, *args, **kwargs):
     super(UploadedFile, self).__init__(*args, **kwargs)
     if self.accessLink is '':
       self.accessLink = str(uuid.uuid4())

   def __unicode__(self):
     return filename

これは、views.py に含まれる私のインデックスのコードです。

 from django.http import HttpResponse  # Just for lulz                                            
 from django.shortcuts import render
 from django.core.context_processors import csrf
 from django.shortcuts import render_to_response
 from django.template import Template, Context
 from smartfile import BasicClient
 from filemapper.models import UploadedFile

 def index(request):
   if request.method == 'POST':
     c = {}
     c.update(csrf(request))
     authKey = 'ggcCEFzGBcJYAQSHNf7AnF8r7c03cB'
     authPassword = 'CJlxZHCocieiPOKuhI6GdGOwwTMr2i'
     api = BasicClient(authKey, authPassword)
     for f in request.FILES.values():
       # Create our record of the file
       u = UploadedFile(filename=f.name) 
       u.save()
       # Create a directory on smartfile
       api.post('/path/oper/mkdir/', path=u.accessLink)
       # Upload the file to s
       api.post('/path/data/' + u.accessLink, file=f.file, name=u.filename)
       # This page should display how to access the uploade
       return generate(request, u.accessLink)
     else:
       return HttpResponse('File not found')
   else:
     return render(request, 'filemapper/index.html')

ファイルをインデックスに POST しようとすると、コードが失敗します。u.accessLink は正しく形成された UUID ではないため、空白の文字列です。

4

1 に答える 1

0

ここには、Django 開発者として別の方法で行うことがいくつかあります。

  • UUIDField をコーディングする必要はありませんmax_lengthblank=True
  • オーバーライドしないでください -メソッドUploadedFile.__init__で accessLink を設定しますUploadedFile.save()

また、新しいスタイル クラス メソッドをオーバーロードする場合は、メソッドを明示的にsuper呼び出すのではなく、を使用する必要があります。__init__

于 2013-06-18T19:21:14.760 に答える