视图层

Posted shaozheng

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了视图层相关的知识,希望对你有一定的参考价值。

视图层:

发送数据:


三种后端往前端页面发送数据的方式:
httpResponse   --> 字符串
render         --> html数据
redirect       --> 重定向(网址)

网址 : ip+ port + 参数(正则匹配)

#视图函数必须有一个返回值 并且返回值的数据类型必须是HttpResponse对象

JsonResponse :
   ---前后端数据交互的方式!
通常情况下前后端数据交互采用的都是json的字符串(字典)

#后端的工作内容:
    后端只需要写好相应的url接口 前端访问你这个接口;
只需要返回一个大字典 + 开发文档(用来告诉前端工程师 你这个接口能够返回哪些数据)

python后端与前端序列化的方法:

python后端     js前端
json.dumps    JSON.stringify    序列化
json.loads    JSON.parse       反序列化

JsonResponse:

django内序列化:

def index(request):
    user_dic = {'name':'sao逼','password':'123'}
    #存在中文会乱码!!!
#1.第一种:
    json_str = json.dumps(user_dic,ensure_ascii=False)
    #ensure_ascii默认为True,改为False能识别中文
    return HttpResponse(json_str)

#第二种:
return JsonResponse(user_dic,json_dumps_params={'ensure_ascii':False})

## JsonResponse默认是序列化字典用的 如果你想序列化其他数据类型(json模块能够序列化的) 你需要加一个safe参数

#第三种(序列化列表,元组):
l = [1,2,3,4,5,6,7,]
return JsonResponse(l,safe=False)

FBV与CBV

FBV与CBV:
    
FBV:基于函数的视图
CBV:基于类的视图

from django.views import View
from django.shortcuts import render,HttpResponse,redirect


class MyLogin(View):
    def get(self,request):
        print('我是MyLogin里面的get方法')
        return render(request,'login.html')

    def post(self,request):
        print('我是MyLogin里面的post方法')
        return HttpResponse('post')

# 路由的书写 与CBV有点不同
# FBV写法     路由(index) >>> 视图函数内存地址
url(r'^index/',views.index),
# CBV写法
url(r'^login/',views.MyLogin.as_view())
iew

#项目一启动 会自动执行as_view方法

# 1. 函数名 + () : 执行的优先级最高
  2. View类:as_view(cls, **initkwargs)
  3.MyLogin: 手动创建的类
  4.as_view()内闭包-view() --> view
  5.CBV在路由匹配上 其实本质还是FBV

CBV: 在urls内创建的类,必须调用as_view(),
    调用后触发dispath()的执行,确认请求方式 + () ,
    在返回类中自动调用该方法!!!

CBV加装饰器

给CBV加装饰器 使用内置模块:
    
from django.utils.decorators import method_decorator
方法一:
# @method_decorator(outter,name='post')
-->指定类内的post函数,添加装饰器
class MyLogin(View):
    def post(self,request):
        return
方法二:
    # @outter  / 
    # @method_decorator(outter)
    --->放置在函数前,作为函数的装饰器
    def get(self,request):
        print('我是MyLogin里面的get方法')
        return render(request,'login.html')

装饰器实列

装饰器:
import time
from functools import wraps

def outtrt(func):
    @wraps(func)
    def inner(*args,**kwargs):
        start_time = time.time()
        res = func(*args,**kwargs)
        end_time = time.time() - start_time
        print('end_time')
    return inner

以上是关于视图层的主要内容,如果未能解决你的问题,请参考以下文章

使用Architecture Components构建的应用程序是否使其成为“MVVM”,如果是,应用程序的哪些部分与哪个MVVM层相关?

回收站视图未显示在片段中

如何从片段内的列表视图打开链接网址?

如何使列表视图出现在片段中?

如何从活动中更改片段中视图的可见性

片段中的网格视图