DJ4E课程Ad List #1自动评分任务遇405错误及HTML元素检测失败求助
嘿,我看了你的问题和代码,大概率是自动评分工具的请求方式和你的LogoutView配置不匹配导致的!
问题根源
Django自带的LogoutView默认只接受POST请求(这是为了避免CSRF攻击的安全设计),但自动评分工具应该是直接用GET请求访问了logout/?next=/ads/这个地址。这时候服务器会返回405 Method Not Allowed错误,对应的错误页面通常是非常简洁的(甚至没有完整的HTML结构),所以评分工具检测不到页面元素,才会报“节点列表为空”的错误。
解决办法
1. 让LogoutView接受GET请求
修改你urls.py里的logout路径配置,给LogoutView加上http_method_names参数,允许GET请求:
path('logout/', LogoutView.as_view( next_page=reverse_lazy('ads:all'), http_method_names=['get', 'post', 'options'] ), name='logout'),
这样不管是你模板里的POST表单提交,还是评分工具的GET请求,都能正常处理,并且跳转到有完整HTML结构的广告列表页,评分工具就能识别到页面内容了。
2. 确认跳转页面的完整性
虽然你已经设置了登出后跳转到ads:all,但要确保广告列表页确实继承了你的base_bootstrap.html,有完整的HTML结构——毕竟评分工具需要检测页面里的元素,空白或不完整的页面还是会导致失败。
3. 检查URL与模板的一致性
你的模板里logout表单的action是/logout/?next={% url 'ads:all' %},和urls里的logout/路径是匹配的,这部分没问题。如果之后你改用django.contrib.auth.urls里的accounts/logout/,记得同步修改模板里的action路径。
试试这些调整,应该能解决评分工具的最后一个测试项问题!
备注:内容来源于stack exchange,提问作者Lucas Patriquin

