使用web.py访问动态URL时base layout中CSS/JS不加载如何解决
问题复现
开发Web项目使用web.py框架,配置的URL结构如下:
urls = ( '/', 'Home', '/register','Register', '/postregistration', 'PostRegistration', '/login', 'Login', '/check-login', 'CheckLogin', '/logout', 'Logout', '/post-activity', 'PostActivity', '/profile/(.*)/info', 'userInfo', '/profile/(.*)', 'Profile', '/abcd', 'abcd' )
其余页面访问均正常,访问/profile/anything这类带动态参数的URL页面时,base layout中引入的CSS与JS文件都没有加载成功,请求到的所有CSS、JS文件内部实际存储的是HTML内容。
问题根因
base layout中使用相对路径引入静态资源,当访问二级路径/profile/xxx时,浏览器会自动将当前页面路径作为前缀拼接静态资源地址,实际请求地址变为/profile/xxx/css/xxx.css,该地址命中配置的/profile/(.*)动态路由,返回Profile页的HTML内容,导致静态资源内容异常。
解决方案
- 将所有静态资源引用改为绝对路径,开头统一加
/。例如将href="css/style.css"改为href="/css/style.css",src="js/common.js"改为src="/js/common.js",浏览器会直接从站点根目录请求资源,不会拼接当前页面路径。 - 在base layout的
<head>标签内添加<base href="/">,页面内所有相对路径的资源引用都会自动基于站点根路径解析,无需逐个修改资源引用地址。 - 如果静态资源统一存放在指定目录(比如static目录),可以在URL配置最前面添加静态资源路由,优先级高于所有动态路由,避免被动态规则拦截:
urls = ( '/static/(.*)', web.StaticApp, {'root': 'static'}, # 原有其他路由 )
内容的提问来源于stack exchange,提问作者Deep
相关产品推荐
相关产品推荐

