即使文件在手动检查时存在,也无法访问媒体文件
Not able to access media file even if file exists when checked manually
我有一个 Django 无法访问的媒体文件,即使我在浏览器中输入 URL 它确实存在。
信息
- 语言:Python [v.3.9.7]
- 平台:Django [v.3.2.8]
目标
能够访问媒体文件
描述
事实是,人们可以在我的网站上上传书籍。人们上传这些书籍的不同尺寸的图片,所以我希望能够处理所有这些图片,所以我访问了图片的宽度和高度,然后将其用作视图中图片的尺寸(CSS).为此,我使用了一个自定义过滤器 image_size
,它将完成访问图像和查找其大小的所有工作,我将其发送回视图:
@register.filter
def image_size(img, host):
img = host[0] + "://" + host[1] + img
with Image.open(img) as image:
width, height = image.size
dct = {
"width": width,
"height": height
}
return dct
这里,host[0]
是镜像URL的协议(request.scheme
),host[1]
是主机名(request.get_host()
)。这是我的观点:
def all_books(request):
if request.user.is_authenticated:
context = {
"books": Book.objects.all(),
"request": request,
"user_profile": UserProfileInfo.objects.get(user=request.user),
"mail_sent": False,
}
else:
context = {
"books": Book.objects.all(),
"request": request,
"mail_sent": False,
"user_profile": False,
}
context["host"] = [request.scheme, request.get_host()]
if request.GET.get("context") == "mail_sent":
context["mail_sent"] = True
return render(request, 'main/all_books.html', context)
settings.py 静态和媒体配置:
STATIC_URL = '/static/'
STATICFILES_DIRS = [STATIC_DIR,]
MEDIA_ROOT = os.path.join(BASE_DIR, 'media')
MEDIA_URL = '/media/'
LOGIN_URL = '/main/user_login/'
其中 BASE_DIR
是 Path(__file__).resolve().parent.parent
(Path
是从 pathlib
导入的)
我还没有完成collectstatic
因为出于某种原因它删除了与CSS的连接并且突然没有CSS被渲染。
我应该怎么做才能让它正常工作?
上传的文件转到MEDIA_ROOT,除非在模型字段中有不同的定义
您在过滤器中“手动”构建 img 文件的路径...它不指向 media/...
img = host[0] + "://" + host[1] + img
我不知道你作为 'img' 提交的是什么,但这里看起来字符串只是
img = "https://my_serverm_image"
但是在服务器上,您需要本地路径,具体取决于您的操作系统,例如c:/my_project/media 在 windows 上。
该路径存储在 settings.MEDIA_ROOT 中。
所以正确的字符串可能是:
img = settings.MEDIA_ROOT + img
我有一个 Django 无法访问的媒体文件,即使我在浏览器中输入 URL 它确实存在。
信息
- 语言:Python [v.3.9.7]
- 平台:Django [v.3.2.8]
目标
能够访问媒体文件
描述
事实是,人们可以在我的网站上上传书籍。人们上传这些书籍的不同尺寸的图片,所以我希望能够处理所有这些图片,所以我访问了图片的宽度和高度,然后将其用作视图中图片的尺寸(CSS).为此,我使用了一个自定义过滤器 image_size
,它将完成访问图像和查找其大小的所有工作,我将其发送回视图:
@register.filter
def image_size(img, host):
img = host[0] + "://" + host[1] + img
with Image.open(img) as image:
width, height = image.size
dct = {
"width": width,
"height": height
}
return dct
这里,host[0]
是镜像URL的协议(request.scheme
),host[1]
是主机名(request.get_host()
)。这是我的观点:
def all_books(request):
if request.user.is_authenticated:
context = {
"books": Book.objects.all(),
"request": request,
"user_profile": UserProfileInfo.objects.get(user=request.user),
"mail_sent": False,
}
else:
context = {
"books": Book.objects.all(),
"request": request,
"mail_sent": False,
"user_profile": False,
}
context["host"] = [request.scheme, request.get_host()]
if request.GET.get("context") == "mail_sent":
context["mail_sent"] = True
return render(request, 'main/all_books.html', context)
settings.py 静态和媒体配置:
STATIC_URL = '/static/'
STATICFILES_DIRS = [STATIC_DIR,]
MEDIA_ROOT = os.path.join(BASE_DIR, 'media')
MEDIA_URL = '/media/'
LOGIN_URL = '/main/user_login/'
其中 BASE_DIR
是 Path(__file__).resolve().parent.parent
(Path
是从 pathlib
导入的)
我还没有完成collectstatic
因为出于某种原因它删除了与CSS的连接并且突然没有CSS被渲染。
我应该怎么做才能让它正常工作?
上传的文件转到MEDIA_ROOT,除非在模型字段中有不同的定义 您在过滤器中“手动”构建 img 文件的路径...它不指向 media/...
img = host[0] + "://" + host[1] + img
我不知道你作为 'img' 提交的是什么,但这里看起来字符串只是
img = "https://my_serverm_image"
但是在服务器上,您需要本地路径,具体取决于您的操作系统,例如c:/my_project/media 在 windows 上。 该路径存储在 settings.MEDIA_ROOT 中。 所以正确的字符串可能是:
img = settings.MEDIA_ROOT + img