python - 如果包含输入类型文件,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">
它可以正常工作。此外,我的媒体文件也得到了正确的服务,只有上传引起了问题
解决方案
在共享主机上部署 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
推荐阅读
- java - 我的自定义 java 插件没有出现在插件中
- javascript - firebase 存储图像必须有图像扩展名吗?
- python - 使用 python 3.7 下载压缩文件
- python - 计算 Pandas DataFrame 中的价格变化
- javascript - React Fullcalendar eventDidMount -> 用新的根组件替换 React 渲染的子组件
- cron - 每 X 分钟运行一次 cron 作业,其中 X 是例如 50
- ansible - 如何将文件内容复制到 Ansible 中的另一个文件而不覆盖第二个文件
- assembly - 攻击实验室阶段2缓冲区溢出
- jenkins - 在詹金斯中格式化通知电子邮件
- c++ - 如何将 C++ 项目导入并运行到使用自己的 Makefile 的 Eclipse 中?