Web开发 ------ 基于Django+Vue网上购物商城(五):前后端分离

Web开发 ------ 基于Django+Vue网上购物商城:前后端分离

完整项目地址:https://gitee.com/dadadaliuliuliiu/ShopProject

一、为什么需要前后端分离?

1.前后端分离的优点

  • PC、APP、Pad多端适应的需求。
  • SPA, 单页Web应用(single page web application)
    我们使用过的很多看起来很高级的网页,比如网易云或者京东等页面,他们比较厉害的一点是页面看起来只有一个,不管你点击什么地方,永远不会刷新页面,都是感觉是在一个页面上完成的操作。
  • 前后端开发职责不清晰(eg: template是由前端还是后端负责?)
  • 开发效率问题,前后端互相等待
    前端一直配合后端,能力受限
    后台开发语言和模板高度耦合,导致开发语言严重依赖.

2.前后端分离的缺点

  • 前后端学习门槛增加, 前端工作量加大
  • 数据依赖导致文档的重要性增加
  • SEO的难度增加: baidu --> westos —> api
    SEO(Search Engine Optimization)搜索引擎优化。
  • 后端开发模式迁移增加成本

总结: 前后端分离是未来的趋势,像APP开发不需要SEO优化的。

二、RESTful API

rest_frameworkhttps://blog.csdn.net/dakengbi/article/details/90764412框架是基于Django的,帮助我们快速开发符合restful规范的接口框架,它主要适用于前后端分离项目。

RESTful:Representational State Transfer(表象层状态转变),只是一种架构方式的约束,给出一种约定的标准,完全严格遵守RESTful标准并不是很多,也没有必要。但是在实际运用中,有RESTful标准可以参考,是十分有必要的。在工作中对api接口规范、命名规则、返回值、授权验证等进行一定的约束

  • 轻量, 直接通过HTTP协议(不需要额外的协议), 执行GET/POST/DELETE/PUT/PATCH操作.
  • 面向资源,(goods/1,1就是资源)一目了然,具有自解释性。
  • 数据描述简单,一般使用xml或者json做数据通讯。

三、渐进式框架Vue

Vue 是一套用于构建用户界面的渐进式框架。Vue 被设计为可以自底向上逐层应用。Vue两大核心思想:组件化和数据驱动。
View通过View-Model的DOM Listeners将事件绑定到Model上,而Model则通过Data Bindings来
管理View中的数据,View-Model从中起到一个连接桥的作用。

1.Vue环境搭建

npm install vue-cli -g  //全局安装 vue-cli

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
1.安装 nodejs
在这里插入图片描述
2.命令行安装cnpm, 使用淘宝的镜像源
安装nodejs后就有了npm命令

(base) F:\ziliao\python_kaifa\my_code\12_django项目2\vueExecise\online-store-vue-master>npm install -g cnpm --registry=https://registry.npm.taobao.org
C:\Users\daliu\AppData\Roaming\npm\cnpm -> C:\Users\daliu\AppData\Roaming\npm\node_modules\cnpm\bin\cnpm+ cnpm@6.1.1 added 685 packages from 953 contributors in 31.308s

3.下载Vue项目代码
4.切换到文件目录, 安装依赖包

(base) F:\ziliao\python_kaifa\my_code\12_django项目2\vueExecise\online-store-vue-master>cnpm install

5.独立的运行前端项目

(base) F:\ziliao\python_kaifa\my_code\12_django项目2\vueExecise\online-store-vue-master>npm run dev

6.浏览器访问http://localhost:8080
在这里插入图片描述

2.商品分类数据与Vue

接口相关代码都放在src/api/api.js里面,调试接口的时候我们首先需要新建一个自己的host,然后替换要调试的host
新建local_host

let local_host = 'http://47.105.62.144:8000';

替换商品类别默认的host

//获取商品类别信息
export const getCategory = params => {
   
  if('id' in params){
   
    return axios.get(`${
   local_host}/categorys/`+params.id+'/');
  }
  else {
   
    return axios.get(`${
   local_host}/categorys/`, params);
  }
};

这个时候在pycharm进入服务器激活虚拟环境运行ShopProject项目
访问 http://127.0.0.1:8080
发现不显示商品分类了,是因为这涉及到了跨域问题,前端与后端分处不同的域名。

3.跨域问题解决

什么是跨域?
CORS全称Cross-Origin Resource Sharing,意为跨域资源共享。当浏览器从一个资源(域名)去访问另一个不同域名或者同域名不同端口的资源时,就会发出跨域请求。如果此时另一个资源不允许其进行跨域资源访问,那么访问的那个资源就会遇到跨域问题。

域名:
主域名不同 http://www.baidu.com/index.html -->http://www.sina.com/test.js
子域名不同 http://www.666.baidu.com/index.html -->http://www.555.baidu.com/test.js
域名和域名ip http://www.baidu.com/index.html -->http://180.149.132.47/test.js
端口:
http://www.baidu.com:8080/index.html–> http://www.baidu.com:8081/test.js
协议:
http://www.baidu.com:8080/index.html–> https://www.baidu.com:8080/test.js

后端服务器解决跨域问题的方法:

我们需要为后端添加跨域访问的支持。使用CORS中间键来解决后端对跨域访问的支持。
1.安装模块: django-cors-headers
django-cors-headers 使用说明:https://github.com/ottoyiu/django-cors-headers

(venv) [root@todolist-server ShopProject]# pip install -i https://pypi.douban.com/simple django-cors-headers

2.添加子应用coreschema到INSTALL_APPS中

 'coreschema',

3.添加中间件corsheaders.middleware.CorsMiddleware

MIDDLEWARE = [ 
	# 要放的尽可能靠前,必须在CsrfViewMiddleware之前。我们直接放在第一个位置就好了 
	'corsheaders.middleware.CorsMiddleware', 
	# ........ 
]

4.设置允许跨域:

 CORS_ORIGIN_ALLOW_ALL = True

5.访问 http://127.0.0.1:8080 数据就可以填充进来了

此时运行ShopProject项目
访问 http://127.0.0.1:8080
商品分类详情信息就能显示了
在这里插入图片描述

四、Vue基本组件

1.第一个Vue程序实现步骤

在这里插入图片描述

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
    <!-- 1. 导入开发版本的Vue.js    -->
    <!-- 开发环境版本,包含了有帮助的命令行警告 -->
    <script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script>
</head>
<body>

<!--
3. 使用简洁的模板语法把数据渲染到页面上
id='idname'         #idname
class='clsname'     .clsname
-->
<!--Vue实例的作用范围是什么呢?
Vue会管理el选项命中的元素及其内部的后代元素.
-->
<p>{
   {
   name}}</p>
<div id="app" class="appcls">
    {
   {
    name }} -{
   {
    age }}
    <h3 style="color: red">{
   {
   name}}</h3>
    <ul>
        <li>{
   {
   foods[0]}}</li>
        <li>{
   {
   foods[1]}
  • 4
    点赞
  • 26
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值