I've found a few posts about this. But I'm still confused.
I want to use django rest framework api to be consumed by vue. My questions:
Should I use django templates at all? I guess not, cause the django templates syntax clashes with vue. But still I need to serve templates - should I just use static templates with apache?
Assuming I do use static templates, how can I prerender pages like with django templates?
I mean, with django I have a url like /resource?id=5,
But with rest api, it will be vue responsibility to fetch the id=5 resource from the url and to do the rendering, But I don't like the need for extra xhr.
It seems that all the docs assume I use node.js, I don't. Do I have to use another node.js server in addition to the django apache server?
Does vue.js with webpack/npm force a specific app folder structure? How that works with the normal django project structure?
答案 0 :(得分:7)
关于vue的第一件事就是它可以很好地扩展。您可以使用它来完成整个单页应用程序,让vue驱动您的整个前端,或者您可以使用它来构建具有更多交互性的单个组件,并使用其他内容呈现其余组件。你问题的答案取决于你的目标。通常情况下,SPA(单页应用程序)感觉更现代化,根据我的经验,可以产生更清晰的关注点,所以我个人也会这样做,但我会描述这两种策略:
建立SPA:
不,在这种情况下不是。在建造SPA时,您的背部和前端完全脱钩。您将使用vue渲染所有内容并使用vue路由器进行路由。 Django不需要知道你的前端,它应该只暴露一个API(例如REST)。在这种情况下,您的前端成为该API的一个实现,使用异步数据获取(例如使用axios)从Django后端获取必要的模型。此外,django不需要为您的模板提供服务,只需构建vue项目并将文件放在服务器上。
vue路由器对这些东西有一个很好的封装,你不必自己从url获取params,它会为你处理并直接将这些params传递给你的组件,参见{{ 3}}。是的,需要额外的XHR,但请考虑以下场景:当使用django渲染页面时,django将输出比vue更大的html文件。因此,vue所需的“额外负载”只是稍微改变了一点,但流量没有大幅增加。
Vue纯粹是一个前端框架,所以它不关心你正在使用的后端。因为它只是前端webpack的输出将是原始的html,js和css。不需要节点服务器,任何可以提供这些文件的东西都可以完成这项工作。但是,由于vue在浏览器中完全呈现,搜索引擎很难抓取你的SPA。为了解决这个问题,有一种叫做服务器端渲染的东西。如果您认为自己需要搜索引擎优化,可能需要查看here。当采用服务器端渲染方法时,您需要一个节点服务器,否则不需要。
在SPA场景中,您不在乎。实际上,SPA可以位于完全不同的服务器上,并且仍然可以与django后端一起正常运行,因为它使用纯粹的异步调用来获取所有数据。
仅针对单个组件使用Vue:
在这种情况下,您希望使用django渲染大多数网站数据。只有在需要交互性或异步调用时,才应编写vue组件。您可以将它们直接放入django模板中,请记住,组件的渲染将在用户浏览器中完成。
即使在这种情况下,影响也很小。使用webpack构建你的vue项目,将已编译的js / css文件放在django的assets文件夹中(我不是django专家,但它只需要可以访问django)。然后确保在django模板的标题中包含所有这些(请查看vue build命令产生的index.html标头),并确保应用程序的父标记具有正确的vue标识引导应用程序,例如默认值为:<div id="app">...</div>
这就是全部。
答案 1 :(得分:2)
我自己刚刚实施了Vue + Django项目,我可以保证Philip Feldmann在详细回复中所说的一切。
我会强调一点,虽然看起来你问的问题有点模糊。从架构的角度来看,Vue和Vue的路由器正在处理您传统上与URL导航相关联的内容以及用户对站点/应用程序的视觉体验的更改。
在Django方面,你基本上不用渲染所有的HTML。相反,您通过urls.py和传统Django路由映射请求的是Python代码,用于生成和返回Vue应用程序使用的数据。因此,映射到Django应用程序的请求会返回JSON之类的内容,而不是完全形成的网页。
这就是为什么你不需要传统意义上的传统Django模板。相反,处理请求的Django方法将执行诸如验证视图参数发送的请求(通常是http POST请求)之类的操作,确保正确处理身份验证和授权等操作,然后执行数据库模型查询以获取要返回的数据通过JSON或客户端期望的任何序列化,Django基本上只是一个后端解决方案。
我已经玩了很长一段时间了,我会告诉你,用这种方式使用Django特别好...... Django管理员是一个很好的地方,可以使用Vue应用程序的后端。我知道很多人都对Vue + Node设置感兴趣,但如果你是一个Python人并且对Django有所了解,那么这是一个很好的选择。