从Wagtail 4.0.2升级至4.1.2后图片上传报403错误求助
Wagtail 4.0.2 升级到4.1.2后图片上传403且模板'site_root'变量解析失败
问题场景
按照Wagtail官方升级指南完成从4.0.2到4.1.2的版本升级后,出现两个关联问题:
- 图片上传操作返回403错误
- 服务器端Django日志抛出模板变量解析异常,具体错误如下:
Exception while resolving variable 'site_root' in template 'home/home_page.html'. Traceback (most recent call last): File "/var/app/venv/staging-LQM1lest/lib/python3.8/site-packages/django/template/base.py", line 880, in _resolve_lookup current = current[bit] File "/var/app/venv/staging-LQM1lest/lib/python3.8/site-packages/django/template/context.py", line 83, in __getitem__ raise KeyError(key) KeyError: 'site_root' During handling of the above exception, another exception occurred: Traceback (most recent call last): File "/var/app/venv/staging-LQM1lest/lib/python3.8/site-packages/django/template/base.py", line 886, in _resolve_lookup if isinstance(current, BaseContext) and getattr( AttributeError: type object 'RequestContext' has no attribute 'site_root'
解决方案
1. 修复site_root模板变量缺失问题
Wagtail 4.1版本调整了模板上下文的默认注入变量,site_root不再自动添加到上下文,需手动补充:
方式一:在页面模型中添加上下文
修改你的首页模型(如HomePage)的get_context方法:
from wagtail.models import Site class HomePage(Page): # ... 原有字段定义 def get_context(self, request, *args, **kwargs): context = super().get_context(request, *args, **kwargs) # 添加site_root变量 context['site_root'] = Site.objects.get(is_default_site=True).root_page return context
方式二:自定义上下文处理器
- 在项目中创建上下文处理器文件(如
your_app/context_processors.py):
from wagtail.models import Site def site_root(request): return {'site_root': Site.objects.get(is_default_site=True).root_page}
- 在
settings.py的模板配置中添加该处理器:
TEMPLATES = [ { # ... 其他模板配置 'OPTIONS': { 'context_processors': [ # ... 原有上下文处理器 'your_app.context_processors.site_root', ], }, }, ]
2. 排查AWS S3 403权限问题
模板错误可能干扰上传流程的权限校验,先修复模板问题后再测试。若仍出现403,检查以下配置:
- S3存储桶CORS配置:确保允许当前域名的
POST请求,示例配置:
<CORSConfiguration> <CORSRule> <AllowedOrigin>https://your-production-domain.com</AllowedOrigin> <AllowedMethod>POST</AllowedMethod> <AllowedHeader>*</AllowedHeader> <MaxAgeSeconds>3000</MaxAgeSeconds> </CORSRule> </CORSConfiguration>
- S3密钥权限:确认配置的
AWS_ACCESS_KEY_ID对应的IAM用户拥有s3:PutObject、s3:GetObject等必要权限 - Wagtail存储配置:验证
settings.py中存储相关配置未被升级覆盖:
DEFAULT_FILE_STORAGE = 'storages.backends.s3boto3.S3Boto3Storage' AWS_STORAGE_BUCKET_NAME = 'your-bucket-name' MEDIA_URL = f'https://{AWS_STORAGE_BUCKET_NAME}.s3.amazonaws.com/'
3. 验证升级兼容性
- 检查是否自定义了Wagtail admin或首页模板,确认模板代码适配Wagtail 4.1的上下文结构,避免依赖已移除的默认变量
- 运行
python manage.py check命令,修复所有Django配置兼容性警告或错误
内容的提问来源于stack exchange,提问作者Spinoza GL
相关产品推荐
相关产品推荐

