首页 > 解决方案 > 如果包含输入类型文件,Django 表单返回 404 Page not found

问题描述

我正在使用 Django==2.1 和 Pillow==7.1.2

当我<input type="file">在 django 表单中包含并发布它时,找不到 404 页面是我得到的错误。

我的模板由以下表格组成:

<form method="POST" enctype="multipart/form-data">
    {% csrf_token %}
    {% if success %}
        <p>Success</p>
    {% endif %}
    <input type="file" name="file">
    <input type="submit">
</form>

view.py 是:

from django.shortcuts import render
from myapp.models import Upload
def upload(request):
    if request.method == "POST":
        myfile = request.FILES.get('file')
        upload = Upload(myfile=myfile)
        upload.save()
        data = {
            'success': "Success"
        }
        return render(request, 'file.html', data)
    else:
        return render(request, 'file.html')

urls.py 是:

from django.urls import path
from . import views
from django.conf import settings
from django.conf.urls.static import static

urlpatterns = [
    path('admin/', admin.site.urls),
    path('', views.upload, name="upload"),
] + static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT)

设置.py:

MEDIA_ROOT = '/my/path/to/media'
MEDIA_URL = '/media/'

该代码在 localhost 上运行良好,但在 CPanel 共享主机上托管时出现错误。如果我删除<input type="file">并尝试<input type="text">它可以正常工作。此外,我的媒体文件也得到了正确的服务,只有上传引起了问题

标签: pythondjangocpanel

解决方案


在共享主机上部署 django 应用程序时,我曾多次遇到同样的错误。

在生产中,django 不像在开发中那样直接提供静态和媒体文件。 选项一 如果您希望 django 直接提供媒体文件,请pip install mod_wsgi在生产服务器上使用按照此处的说明进行操作

选项二 使用媒体桶存储,例如 AWS,但您可以通过创建公共 github 存储库来使用 github 提供的免费存储,然后为其生成访问令牌。Afterwords install django-github-s3。然后在您的 settings.py 中添加此代码

DEFAULT_FILE_STORAGE = "github_storages.backend.BackendStorages"
GITHUB_HANDLE = "your_github_username"
ACCESS_TOKEN = "access_token_generated"
GITHUB_REPO_NAME = "repo_name"
MEDIA_BUCKET_NAME = "media_folder"

**NB:** don't forget to add `'github_storages'` to your installed_apps

推荐阅读