Djangoはどうやってファイルのアップロードを実現しますか?


1.はじめに
皆さん、こんにちは。
ファイルのアップロード、ダウンロードは基礎機能として、Webプロジェクトの中でとても普遍的で、Djangoプロジェクトはどのようにファイルアップロードのダウンロードを実現しますか?
この文章はみんなを連れて5分でファイルアップロードのダウンロード機能を実現します。
2.実戦してください
詳細な実装手順は以下の通りです(9ステップ)
2-1  仮想環境に入り、プロジェクトとアプリを作成します。

workon django3

#     
django-admin startproject file_up_and_down_demo

#        
cd file_up_and_down_demo/

#     App
django-admin startapp index
2-2  テンプレートディレクトリを作成し、settings.pyを設定します。
index Appでtemplatesフォルダを作成し、プロジェクトプロファイルsettings.pyにAppとテンプレートディレクトリを設定します。

# settings.py

#   App
INSTALLED_APPS = [
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
    'index',
]

TEMPLATES = [
    {
        'BACKEND': 'django.template.backends.django.DjangoTemplates',
        'DIRS': [
            #       
            os.path.join(BASE_DIR, 'index/templates')
        ],
        'APP_DIRS': True,
        'OPTIONS': {
            'context_processors': [
                'django.template.context_processors.debug',
                'django.template.context_processors.request',
                'django.contrib.auth.context_processors.auth',
                'django.contrib.messages.context_processors.messages',
            ],
        },
    },
]
2-3  ファイルモデルを作成し、データベースにマップします。
デフォルトのsqliteを例にとって、index Appの下のmodels.pyで代表ファイルのモデルをカスタマイズします。
モデルは3つのフィールドを含みます。
  • ファイル名
  • ファイル保存経路
  • アップロード時間
  • 
    # index App models.py
    
    from django.db import models
    from django.utils import timezone
    
    
    #     
    class FileModel(models.Model):
        #     
        name = models.CharField(max_length=50)
    
        #       
        path = models.CharField(max_length=100)
    
        #     
        upload_time = models.DateTimeField(default=timezone.now)
    次に、プロジェクトのルートディレクトリで次の2つのコマンドを実行して、モデル構造をデータベースにマッピングします。
    
    #      
    Python3 manage.py makemigrations
    
    python3 manage.py migrate
    2-4  フォームのコントロールをカスタマイズ
    indexアプリでフォームファイルforms.pyを作成します。
    フォームクラスを内部でカスタマイズし、次の forms.Form
    
    # index App forms.py
    
    from django import forms
    
    class FileForm(forms.Form):
        file = forms.FileField(
            #        
            widget=forms.ClearableFileInput(attrs={'multiple': True}),
            label='     ',
        )
    2-5  アップロード、ダウンロードルートのURLを追加します。
    アップロード、ダウンロード機能のためにルートURLを追加します。
    
    #   urls.py
    from django.contrib import admin
    from django.urls import path, include
    
    urlpatterns = [
        path('admin/', admin.site.urls),
        path('', include('index.urls'))
    ]
    
    # index App urls.py
    from django.urls import path
    
    from .views import *
    
    urlpatterns = [
        #   
        path('', index_view, name='index'),
    
        #   
        path('download/<id>', download_view, name='download')
    ]
    2-6  テンプレートファイルを作成
    index Appのテンプレートフォルダに簡単なテンプレートファイルを作成します。 upload.
    そのうち
  • formは、ビュー関数を表すフォームエンティティオブジェクト
  • を表しています。
  • form.as_pは、フィールド形式ですべてのフォーム要素をレンダリングする
  • を表しています。
    
    # index App upload.html
    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <title>  -    </title>
    </head>
    <body>
    
    <form method="post" enctype="multipart/form-data">
        {% csrf_token %}
        {{ form.as_p }}
        <input type="submit" value="    ">
    </form>
    
    </body>
    </html>
    2-7  ビュー関数をアップロード
    index Appのviews.pyでアップロード機能を作成するビュー関数
    注意したいのは、プロジェクトのルートディレクトリにアップロードされたファイルを保存するためのアップロードフォルダを作成する必要があります。
    
    # index App views.py
    
    def index_view(request):
        """
            
        :param request:
        :return:
        """
        if request.method == 'POST':
            form = FileForm(request.POST, request.FILES)
            if form.is_valid():
                #      
                files = request.FILES.getlist('file')
    
                #          
                for file in files:
                    #        
                    file_model = FileModel(name=file.name, path=os.path.join('./upload', file.name))
                    file_model.save()
    
                    #         
                    destination = open(os.path.join("./upload", file.name), 'wb+')
                    for chunk in file.chunks():
                        destination.write(chunk)
                    destination.close()
    
                #       
                return HttpResponse('    !')
        else:
            form = FileForm()
            return render(request, 'upload.html', locals())
    2-8  ビュー関数をダウンロード
    次に、ダウンロード機能を作成するためのビュー関数
    
    # index App views.py
    
    def download_view(request, id):
        """
            
        :param request:
        :param id:  id
        :return:
        """
        file_result = FileModel.objects.filter(id=id)
    
        #       ,     
        if file_result:
    
            file = list(file_result)[0]
    
            #        
            name = file.name
            path = file.path
    
            #     
            file = open(path, 'rb')
            response = FileResponse(file)
    
            #   urlquote         
            response['Content-Disposition'] = 'attachment;filename="%s"' % urlquote(name)
    
            return response
        else:
            return HttpResponse('     !')
    2-9  実行とテスト
    プロジェクトを実行し、下記のアドレスにアクセスし、ファイルをアップロードします。

    Pycharmを使ってsqliteデータベースを開けたら、ファイルレコードの挿入に成功し、ファイルもupladフォルダの下にアップロードされました。
    次に下記のアドレスにアクセスしてファイルダウンロード機能を実現します。IDはファイルのID値を表します。」
    http://127.0.0.1:8000/download/file_id。
    3.最後に
    文章は簡単な例を通して、ファイルのアップロード、ダウンロード機能を実現し、ファイルをデータベースに記録します。
    実際のプロジェクトには、ファイルリスト、ファイル削除などの機能が含まれていますが、これらの機能はデータベースと組み合わせて削除して変更すれば大丈夫です。
    コードアドレス:https://github.com/xingag/python_web
    以上はDjangoがどのようにファイルアップロードのダウンロードの詳細を実現しますか?