(二十一)Django的类视图和动静分离

一、Django 类视图

我们通常使用的是函数作为处理请求的视图,直接、明了。但是,django只给GET和POST提供了快速的请求数据接收的方法,对于其他方法没有详细的介绍,于是在后来引进了视图类的概念。

类视图的使用步骤演示:
1、导入视图类的父类,继承View父类,编写视图类

from django.views import View

进入系统的视图类,可以看到request的方法列表
在这里插入图片描述
在这里插入图片描述
2、指出类视图的url,类视图的url可能跟函数视图有一些不一样,路径名还是照样起就行,后面跟类视图名+as_view()方法
在这里插入图片描述

二、Django的动静分离

1、Django动静分离概念及优缺点

动静分离就是将网站的动态数据和静态资源(html,javascript,css,img等文件)进行分开部署,提高用户访问静态资源的速度。在django的部署当中本身就有一部分资源被动静分离。独立APP的静态文件收集就是为了做动静分离。还有没有完成的是html的静态化。

  • 将js、jq、css、img上传到一个单独目录,然后用服务器指出,CDN服务器。
  • 在网站开发过程当中,大量使用api接口,网站页面的数据是通过请求api接口然后进行渲染,而不是通过请求视图进行渲染,常用的技术 api接口开发、json数据格式、ajax请求、vue渲染。
  • 前后端域名分离,要求有两台服务器。

优点:

  • Api接口服务化,后端更加服务化,只需要通过api接口提供数据,多个功能模块或者多个平台都可以使用。
  • 前后端并行开发,开发效率提高,互不干扰。
  • 减轻服务器压力

缺点:

  • 不利于seo,搜索引擎优化
  • 开发量变大。后端针对每个数据都要有指定的接口
  • 不好进行业务变更,开发初期,使用接口很快,但是后期api接口增多,管理api和进行业务变更变的很困难。

2、vue框架

搭建api接口。就是视图只返回需要的数据,这个数据通常是json或者xml格式。涉及到api接口。

  • 请求规范
  • 响应规范

以用户数据查询为例:

request = {
	“type”: “select”/get/”update”/delete/”create”,
	“data”:””
	}
response={
	“status”: 200(成功),
	“data”: ””
	}

1、使用视图类定义接口视图

from django.views import View
from django.http import HttpResponse,JsonResponse

class LoginUserApi(View):
    def get(self,request):
        result = {"status":"400","data":""}
        data = request.GET
        if data:
            types = data.get("type")
            if types == "get":
                id = data.get("id")
                if id:
                    try:
                        user = LoginUser.objects.get(id = int(id))
                        db_data = [
                            {
                                "username":user.username,
                                "password":user.password,
                                "picture":user.picture.url
                             }
                        ]
                        result["status"] = 200
                        result["data"] = db_data
                    except Exception as e:
                        result["data"] = str(e)

                else:
                    result["data"] = "id为空"

            elif types == "select":
                user_info = LoginUser.objects.all()
                db_data = [
                            {
                                "username":user.username,
                                "password":user.password,
                                "picture":user.picture.url
                             }
                            for user in user_info
                        ]
                result["status"] = 200
                result["data"] = db_data

            else:
                result["data"] = "不是合法请求"

        else:
            result["data"] = "请求数据为空"

        return JsonResponse(result)


2、添加接口视图类路由

path('LoginUser/', LoginUserApi.as_view())

3、可以直接访问路由,看看是什么效果
在这里插入图片描述
4、如果加上参数(type,id),看看什么效果
这里的type使我们自己定义的方式(暂时有get和select),id为后端数据库中的数据id主键
在这里插入图片描述
在这里插入图片描述

5、现在我们重新新建一个html文档,使用ajax请求接口视图,进行数据渲染

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
    <script src="/static/loginapp/js/jquery.min.js"></script>
</head>
<body>
    <div id="content">
     
    </div>

    <script>
       $(function () {
           url = "/login/LoginUser/?type=select";
           $.ajax(
               {
                   url: url,
                   type: "get",
                   data: "",
                   success: function (data) {
                       db_data = data["data"];
                       for (var i in db_data){
                           console.log("===============");
                           var html_str =
                               "<p>"+"账户:"+db_data[i]["username"]+"<br>"+
                                   "密码:"+db_data[i]["password"]+"<br>"+
                                  "图片:"+ db_data[i]["picture"]+"<br>"+"</p>";
                           console.log(html_str);
                           $("#content").append(html_str);
                           console.log("===============")
                       }
                       {#console.log(db_data)#}

                   },
                   error: function (error) {
                       console.log(error)
                   }
               }
           )
       })
    </script>

</body>
</html>

在这里插入图片描述

当然数据是通过ajax接口从后端渲染过来了,但是无法实现动静分离效果,vue恰好能够解决这个问题:后端使用vue的目的就是把ajax里面的数据绑定到前端,实现动静分离。

<script>
        Vue.use(VueResource);//声明使用VueResource的vue对象
        var vue = new Vue(
            {
                el: "#table",//获取元素标签
                data: 
                {	
                	变量1:“”,
                	变量2:“”
                }//定义变量的关键字,也可以是存储数据的地方
                created: //初始化执行,通常用于第一页的自动加载数据
                methods:{}//方法,vue ajax就写这里
       
            }
        )
    </script>

基本vue框架使用格式:
在这里插入图片描述

vue绑定被分为两个部分:
HTML部分:
就是要绑定位置,通常用vue的语法来定义绑定的变量。
Django和vue默认都用{{ }}作为变量的标识,在django是有冲突的,所以要使用 verbatim标签进行转义。

{% verbatim %}
{% endverbatim %}

Js部分:js部分是vue变量声明的部分,vue变量声明的规则很明确,

  • 1、实例化一个vue对象
  • 2、使用el来指定要绑定的标签,选择器遵循jq
  • 3、使用data来指定具体的变量内容
  • 4、Vue可以绑定字符也可以绑定函数,绑定函数的关键字是method
  • 5、Vue 本身不支持ajax异步请求,所以,我们通常要使用vue的扩展插件vue-resource,但是二者语法一样,vue-resource目前交给三方团队维护。又有人开始推崇axios框架进行异步的mvvm数据绑定。

常规的vue绑定有以下几种:
①v-model 双向绑定,是vue绑定的一大特色。
在这里插入图片描述
在这里插入图片描述
②v-bind 绑定数据的属性,在工作当中相当频繁的绑定
在这里插入图片描述
③v-if 和v-show对绑定的内容判断
在这里插入图片描述
v-show和v-if的区别,if着重是否添加元素,show着重是否显示(隐藏),修改HTML的display的样式
在这里插入图片描述
在这里插入图片描述
④v-for 对绑定的内容进行循环(绑定哪个标签,就循环 哪个)
在这里插入图片描述
在这里插入图片描述
⑤v-on 绑定事件
在这里插入图片描述

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
    <script src="/static/loginapp/js/jquery.min.js"></script>
    <script src="/static/loginapp/js/vue.min.js"></script>
    <style>
        .red{
            color: red;
        }
    </style>
</head>
<body>
    {% verbatim %}
    <div id="app">
        <div>
            <p>v-model双向绑定</p>
            <p>=================================</p>
            <p>{{ message }}</p>
            <p><input type="text" v-model="message"></p>
            <p>=================================</p>
        </div>

        <div>
            <p>v-bind属性绑定</p>
            <p>=================================</p>
            <p v-bind:class="class_color" v-bind:id="id_name">{{ message }}</p>
            <p>=================================</p>
        </div>

        <div>
            <p>v-if判断绑定</p>
            <p>=================================</p>
            <p v-if="valid">{{ message }}</p>
            <p>=================================</p>
        </div>

        <div>
            <p>v-show判断绑定</p>
            <p>=================================</p>
            <p v-show="valid">{{ message }}</p>
            <p>=================================</p>
        </div>

        <div>
            <p>v-for循环绑定</p>
            <p>=================================</p>
            <p v-for="f in projects">{{ f }}</p>
            <p>=================================</p>
        </div>
        
        <div>
            <p>v-on事件绑定</p>
            <p>=================================</p>
            <p v-on:click="get">{{ message }}</p>
            <p>=================================</p>
        </div>
        
    </div>
    {% endverbatim %}
    <script>
        var Vue = new Vue(
            {
                el: "#app",
                data: {
                    message: "hello",
                    class_color: "red green",
                    id_name:"text",
                    valid:0,
                    projects:["python","java","linux","html"]

                },
                methods:{
                    get:function f() {
                        alert("hello")
        }
            }}
        )
    </script>
</body>
</html>

3、vue-resource

Vue-resource 获取所有用户的列表,并且进行前端渲染
1、导入jq和vue和vue-resource
在这里插入图片描述
2、声明使用vue-resource对象
在这里插入图片描述
3、使用created进行初始化加载
在这里插入图片描述
4、使用methods定义ajax二次请求
在这里插入图片描述
5、使用this对结果进行重新赋值
在这里插入图片描述

def onlyHtml(request):
    return render(request,"loginapp/onlyhtml.html")

def vueHtml(request):
    return render(request,"loginapp/vuehtml.html")

def vurResourceHtml(request):
    return render(request,"loginapp/vue_resource.html")
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
    <script src="/static/loginapp/js/jquery.min.js"></script>
    <script src="/static/loginapp/js/vue.min.js"></script>
    <script src="/static/loginapp/js/vue-resource.js"></script>

</head>
<body>
    {% verbatim %}
    <table id="table">
        <thead>
            <tr>
                <th>账户</th>
                <th>密码</th>
            </tr>
        </thead>
        <tbody>
            <tr v-for="stu in student">
                <td>{{ stu.username }}</td>
                <td>{{ stu.password }}</td>
            </tr>
            <tr>
                <td v-on:click="get(6)" colspan="2">加载</td>
            </tr>
        </tbody>
    </table>
    {% endverbatim %}
    <script>
        Vue.use(VueResource);//声明使用VueResource的vue对象
        var vue = new Vue(
            {
                el: "#table",
                data: {
                    student: [
                        {#{"username":"zzz","password":"123"},#}
                        {#{"username":"sss","password":"123"}#}
                    ],
                    num:2
                },//定义变量的关键字
                created: function(){
                    var url = "/login/LoginUser/?type=get&id=4";
                        this.$http.get(url).then(
                            function (data) {
                                {#console.log(data["data"]["data"])#}
                                db_data = data["data"]["data"];
                                {#console.log(this);#}
                                this.student = db_data;
                            },//相当于ajax中success
                            function (error) {
                                console.log(error)
                            }//相当于ajax中的error
                        )// 发起ajax请求 vue对ajax进行了重新封装 当前写法与$.ajax({type:get})
                },
                methods:{
                    get: function (num) {
                        console.log(num)
                        var url = "/login/LoginUser/?type=select";
                        this.$http.get(url).then(
                            function (data) {
                                {#console.log(data["data"]["data"])#}
                                db_data = data["data"]["data"];
                                {#console.log(this);#}
                                this.student = db_data;
                            },//相当于ajax中success
                            function (error) {
                                console.log(error)
                            }//相当于ajax中的error
                        )// 发起ajax请求 vue对ajax进行了重新封装 当前写法与$.ajax({type:get})
                    }
                }
            }
        )
    </script>
</body>
</html>

初始化执行,通常用于加载第一页
在这里插入图片描述
点击加载,加载出select所有数据
在这里插入图片描述

使用vue-resource做的最多的事情就是绑定列表页。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Django 中有两种主要的视图方式:视图和函数视图。它们各自有自己的优势和适用场景。下面是 Django 视图和函数视图的对比: 1. 视图: - 视图是基于视图,通过继承 Django 提供的基础来实现。 - 视图提供了更强大的功能和更高级的抽象,可以处理更复杂的逻辑和场景。 - 视图提供了一组标准的 HTTP 方法(如 GET、POST、PUT 等)对应于不同的请求型,使得处理不同请求型的逻辑更加清晰。 - 视图具有可重用性,可以通过继承来扩展和定制。 - 视图通常用于需要处理多个请求型、需要复杂逻辑或需要使用 Mixin 的场景。 2. 函数视图: - 函数视图是基于函数的视图,直接编写函数来处理请求和生成响应。 - 函数视图简单直观,适用于处理简单的逻辑和场景。 - 函数视图可以更加灵活地处理请求和响应,可以直接控制返回的数据型和格式。 - 函数视图可以在一个文件中编写,使得代码结构更简洁。 - 函数视图通常用于处理简单的请求、快速原型开发或者需要直接控制请求和响应的场景。 总体而言,视图适用于处理复杂的逻辑和场景,具有更高级的抽象和可重用性;而函数视图则适用于处理简单的逻辑和场景,具有更灵活的请求和响应控制。具体选择哪种视图方式取决于项目的需求和个人偏好。在实际开发中,通常会根据具体情况来选择使用视图或函数视图

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值