2017-10-08 11 views
0

これは私のfirtsの質問です。ご協力いただきありがとうございます。ユーザーがアップロードしたcsvファイルを読み込み、Djangoモードでデータを保存するherokuでライブ

私はDjango School管理アプリを持っています。私はユーザーがcsvファイルを読んで特定のヘッダーを持つデータベースに格納できるようにしたいと思います。

私のコードはローカルで非常にうまく動作します。しかし、最近私はそれをテストできるように英雄を押します。すべての静的資産はAmazon S3に保存されています。それは動作します。

しかし、私がcsvファイルを読み込もうとすると、内部サーバーエラーが発生します。

ここに生徒を保存するコードです。

def convert_header(csvHeader): 
    cols = [ x.replace(' ', '_').lower() for x in csvHeader ] 
    return cols 

def import_data(request): 
    if request.method == 'GET': 
     return render(request, 'school/import.html') 

    if request.method == 'POST' and request.FILES['myfile']: 

     if request.POST.get("object") == '': 
      message = 'You may chose an object' 
      return render(request, 'school/import.html', {'message': message }) 

     if request.POST.get("object") == 'Pupil': 
      myfile = request.FILES['myfile'] 

      fs = FileSystemStorage(location='eSchool/media/documents') 
      filename = fs.save(myfile.name, myfile) 
      uploaded_file_url = fs.path(filename) 

      data = csv.reader(open(uploaded_file_url), delimiter=',') 

      header = next(data) 
      header_cols = convert_header(header) 
      i = 0 
      k = 0 
      for row in data: 
       pupil = Pupil() 
       for k in range(len(header_cols)): 
        row_item = row[k].split(',') 
        for item in row_item: 
         key = header_cols[k] 
         if key == 'responsible': 
          item = Responsible.objects.get(pk= int(item)) 
          print(item.first_name) 
          setattr(pupil, key, item) 
         else: 
          setattr(pupil, key, item) 
        k +=1 

       pupil.save() 
       i = i + 1 
      detailed = 'Sucessfully created '+ str(i) + ' Pupils ' 
      return render(request, 'school/import_success.html', {'detailed' : detailed }) 

Documentという名前のモードにデータを保存したいと思います。私はそれを作成します。私はまだエラーが発生しますそれを試してみてください。助けてください。

+0

エラーメッセージを表示 –

+0

ローカルで実行すると、エラーは発生しません。しかし、私がライブに行くとき、ブラウザでこのエラーが発生します。内部サーバエラー – Wicel

+0

'heroku logs'を実行すると、エラーログが表示されます。 –

答えて

0

私はその問題の解決策を見つけました。まず、アップロードしたファイルのURLを格納するDjangoモデルを作成します。そのように:

class Document(models.Model): 
 
    uploaded_at = models.DateTimeField(auto_now_add=True) 
 
    upload = models.FileField(upload_to='documents')

Obvously私は、すべてのメディア資産の参照とAmazon S3上のすべての静的ファイルを保存するための設定ファイルを設定MEDIA_ROOTとMEDIA_URL を設定する必要がありました。

したがって、クラスFileSystemStorageを使用する代わりに。私はピップで

ピップが要求

をインストールして、私が要求し、CSV形式とコーデックをインポートする「リクエスト」という名前のパッケージをインストールします。

import requests 
 
import codecs

私の見解は、私はほんのちょっと修正TM私機能させることをした後。今だから、

def import_data(request): 
 
\t if request.method == 'GET': 
 
\t \t return render(request, 'school/import.html') 
 

 
\t if request.method == 'POST' and request.FILES['myfile']: 
 

 
\t \t if request.POST.get("object") == '': 
 
\t \t \t message = 'You may chose an object' 
 
\t \t \t return render(request, 'school/import.html', {'message': message }) 
 

 
\t \t if request.POST.get("object") == 'Pupil': 
 
\t \t \t myfile = request.FILES['myfile'] 
 
\t \t \t doc = Document() 
 
\t \t \t doc.upload = myfile 
 
\t \t \t doc.save() 
 
\t \t \t print(doc.upload.url) 
 
\t \t \t if settings.DEBUG == True: # execute that block locally 
 
\t \t \t \t data = csv.reader(open(doc.upload.path), delimiter=',') # locally the file is red frm the path so i us doc.upload.path 
 
\t \t \t else: #this block is executed in production. So the file is red from the url. so I use doc.upload.url 
 
\t \t \t \t rep = requests.get(doc.upload.url) 
 
\t \t \t \t text = codecs.iterdecode(rep.iter_lines(), 'latin_1') #codecs is use to decode the lines. I don't really master how it works. 
 
\t \t \t \t data = csv.reader(text, delimiter = ',') 
 
\t \t \t header = next(data) 
 
\t \t \t header_cols = convert_header(header) 
 
\t \t \t i = 0 
 
\t \t \t k = 0 
 
\t \t \t for row in data: 
 
\t \t \t \t pupil = Pupil() 
 
\t \t \t \t for k in range(len(header_cols)): 
 
\t \t \t \t \t row_item = row[k].split(',') 
 
\t \t \t \t \t for item in row_item: 
 
\t \t \t \t \t \t key = header_cols[k] 
 
\t \t \t \t \t \t if key == 'responsible': 
 
\t \t \t \t \t \t \t item = Responsible.objects.get(pk= int(item)) 
 
\t \t \t \t \t \t \t #print(item.first_name) 
 
\t \t \t \t \t \t \t setattr(pupil, key, item) 
 
\t \t \t \t \t \t else: 
 
\t \t \t \t \t \t \t setattr(pupil, key, item) \t 
 
\t \t \t \t \t k +=1 
 
\t \t \t \t 
 
\t \t \t \t pupil.save() 
 
\t \t \t \t i = i + 1 
 
\t \t \t detailed = 'Sucessfully created '+ str(i) + ' Pupils ' 
 
\t \t \t return render(request, 'school/import_success.html', {'detailed' : detailed })

。すべてがうまくいく。あなたがこのコードについて改善できる何かを見たら、私はすでにあなたの助けに感謝します!

関連する問題