首页 > 其他分享 >今日内容 视图层与模板层

今日内容 视图层与模板层

时间:2022-09-05 16:15:15浏览次数:72  
标签:return request 视图 html 内容 模板 def

  • 网页伪静态

实际上伪静态是个动态页面,只是通过技术手段伪装成立静态页面的样子,伪静态页面的内容是通过读取数据库生成的。

将动态网页伪装成静态网页 从而提升网页被搜索引擎收录的概率,表现形式就是网址看着想一个具体的文件路径

path('index.html',view.index)
  • 视图层

一.视图函数的返回值问题

当浏览器访问服务器的时候,那么服务器响应的数据类型有两种,分别是HTML响应和JsonResponse(前后端分离)

视图函数必须返回一个HttpResponse对象

1.HTTP响应

(1)HttpResponse

不使用模板,直接HttpResponse()

# 创建主路由
url(r'^res/',include('ResApp.urls'))
# 创建子路由
url(r'^testResponse/',views.testResponse),

# 生成视图函数
def testResponse(request):
    response = HttpResponse()
    response.content ='英雄联盟'
    response.status_code = 404
    # 直接写出文本
    response.write('亚索')
# 一次性读取剩余字节,冲刷缓存区
    response.flush()
    return response

(2)render

render方法的返回值类型也是一个HttpResponse

# 生成视图函数
def testRender(request):
    return render(request,'testRender.html')

# 对render剪切方便查看类型
def testRender(request):
    response = render(request,'testRender.html')
    print(type(response))
    return response
# 创建testRender.html模板:
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
     哈哈哈哈哈哈
</body>
</html>

(3)HttpResponseRedirect

HttpResponseRedirect:重定向
其是HttpResponse的子类,响应重定向:可以实现服务器内部跳转

# 创建子路由
url(r'^testRedirect/',views.testRedirect),

def testRedirect(request):
    # 重定向就是执行其他的视图函数
    return HttpResponseRedirect('/res/index/')

二.视图函数返回json格式数据

1.JsonResponse

django的视图函数,是不可以直接返回data的
JsonResponse 缺点:中文乱码 ,序列化

# 创建子路由
url(r'^testJson/',views.testJson),
# 生成视图函数
def testJson(request):
    data = {
        'msg': 'ok',
        'status': 200,
        'name': '张三',
    }
    return JsonResponse(data=data)
"""会发现出现了中文乱码的问题  
解决方案"""
def testJson(request):
    data = {
        'msg': 'ok',
        'status': 200,
        'name': '张三',
    }
    #   序列化非字典类型的数据还需要指定safe参数为False  忽略编码
    return JsonResponse(data=data,json_dumps_params={'ensure_ascii':False})

三.form表单携带文件数据

form表单需要具备的条件
        1.method属性值必须是post
        2.enctype属性值必须是multipart/form-data
      后端获取文件数据的操作
          request.FILES

四.FBV与CBV

FBV:基于函数的视图
        def index(request):
            return HttpResponse()
        path('index/', views.index)
CBV:基于类的视图
        from django import views
        class MyView(views.View):
            def get(self, request):
                return HttpResponse('我是CBV里面的get方法')
            def post(self, request):
                return HttpResponse('我是CBV里面的post方法')
         path('func/', views.MyView.as_view())
         """
         CBV会自动根据请求方式的不同匹配类中定义的方法并自动执行
         """

CBV源码分析(重要)

源码分析入口
        path('func/', views.MyView.as_view())
      1.绑定给类的as_view方法
        def as_view(...):
          def view(...):
              pass
          return view
     2.CBV路由匹配本质:跟FBV是一致的
        path('func/', views.view)
     3.访问func触发view执行
        def view(...):
          obj = cls()
          return obj.dispatch()
      '''涉及到对象点名字 一定要确定对象是谁 再确定查找顺序'''
      4.研究dispatch方法
        def dispatch(...):
          func_name = getattr(obj,request.method.lower())
          func_name(...)
  • 模板层

一.模板语法传值

    方式1:指名道姓        指名道姓传参 不浪费资源 
           return render(request, 'modal.html', {'name':name}) 
      方式2:关键字locals()      将整个局部名称空间中的名字去全部传入简单快捷
       return render(request,'modal.html',locals())

二.模板语法传值的范围

基本数据类型直接传递使用
     函数名的传递会自动加括号执行并将返回值展示到页面上
        注意函数如果有参数则不会执行也不会展示 模板语法不支持有参函数
   类名的传递也会自动加括号产生对象并展示到页面上
   对象的传递则直接使用即可
   ps:模板语法会判断每一个名字是否可调用 如果可以则调用!!!
"""django的模板语法在操作容器类型的时候只允许使用句点符"""

三.模板语法过滤器(类似于python内置函数)

 <p>统计长度:{{ s|length }}</p>
    <p>加法运算:{{ i|add:123 }}、加法运算:{{ s|add:'heiheihei' }}</p>
    <p>日期转换:{{ s|date:'Y-m-d H:i:s' }}</p>
    <p>文件大小:{{ file_size|filesizeformat }}</p>
    <p>数据切片:{{ l|slice:'0:10' }}</p>
    <p>字符截取(三个点算一个):{{ s1|truncatechars:6 }}</p>
    <p>单词截取(空格):{{ s1|truncatewords:6 }}</p>
    <p>语法转义:{{ script_tag|safe }}</p>
    <p>语法转义:{{ script_tag1|safe }}</p>
    from django.utils.safestring import mark_safe
    script_tag1 = '<script>alert(666)</script>'
    res = mark_safe(script_tag1)
    ps:有时候html页面上的数据不一定非要在html页面上编写了 也可以后端写好传入
'''django模板语法中的符号就两个 一个{{}} 一个{%%}
    需要使用数据的时候 {{}}
    需要使用方法的时候 {%%}
'''  

四.模板语法标签(类似于python流程控制)

{% if 条件 %}  条件一般是模板语法传过来的数据  直接写名字使用即可
        条件成立执行的代码
    {% elif 条件1 %}
           条件1成立执行的代码    
    {% else %}
            条件都不成立执行的代码
    {% endif %}
    
    
    {% for i in s %}
        {% if forloop.first %}
            <p>这是第一次哟~</p>
        {% elif forloop.last %}
            <p>这是最后一次!</p>
        {% else %}
            <p>{{ i }}</p>
        {% endif %}
        {% empty %}
              <p>你给我的是个空 怎么for循环呢</p>
    {% endfor %}

五.自定义标签函数、过滤器、inclusion_tag

    """
    如果想自定义 必须先做以下三件事
        1.在应用下创建一个名为templatetags文件夹
        2.在该文件夹创建任意名称的py文件
        3.在该py文件内编写自定义相关代码
            from django.template import Library
            register = Library()
    """
    # 自定义过滤器
    @register.filter(name='myfilter')
    def my_add(a, b):
        return a + b
       
    # 自定义标签函数
    @register.simple_tag(name='mt')
    def func(a, b, c, d):
        return a + b + c + d
       
    # 自定义inclusion_tag
    @register.inclusion_tag(filename='it.html')
    def index(n):
        html = []
        for i in range(n):
            html.append('第%s页'%i)
        return locals()
       
    {% load mytag %}
    {{ i|myfilter:1 }}
    {% mt 1 2 3 4 %}
    {% index 10 %}

六.模板的继承

{% extends 'html文件名' %}
       {% block 名字 %}
        模板内容
    {% endblock %}
       {% block 名字 %}
        子板内容
    {% endblock %}
     一般情况下母板中至少应该有三个区域使得扩展性更高!!!
        css content js
    {% block css %}
    {% endblock %}
    {% block content %}
    {% endblock %}
    {% block js %}
    {% endblock %}
       '''子板中还可以使用母板的内容  {{ block.super }} '''

标签:return,request,视图,html,内容,模板,def
From: https://www.cnblogs.com/tai-yang77/p/16651158.html

相关文章

  • 前后端分离前端框架的主要内容是什么?
    当前,前后端分离已经成为发展趋势和方向,是互联网项目开发的业界标准使用方式。那么,大家知道什么是前后端分离吗?其实,就是通过nginx+tomcat的方式(也可以中间加一个nodejs)有效......
  • 【luogu P5826】【模板】子序列自动机
    【模板】子序列自动机题目链接:luoguP5826题目大意给你一个序列,每次再给你一个序列,问你新的序列是不是一开始的序列的子序列。思路如果字符少不难想象到一个\(f_{i,j......
  • 使用notepad++批量在每行首尾添加内容
    1简介在程序员开发过程中,一个不错的工具是notepad++,该工具为notepad的增强,增强了许多的功能,包括程序员喜欢的列块编辑模式,支持众多的插件,例如json格式化,支持markdown语法......
  • Flask 学习-47.Flask-RESTX 自定义响应内容marshal_with
    前言Flask-RESTX提供了一种简单的方法来控制您在响应中实际呈现的数据或期望作为输入有效负载的数据。使用该fields模块,您可以在资源中使用所需的任何对象(ORM模型/自定......
  • Ae使用教程:如何在 After Effects 中使用重定向摄像机视图?
    欢迎观看AfterEffects教程,小编带大家学习AfterEffects的基本工具和使用技巧,了解如何在AE中使用重定向摄像机视图。在Facebook和GearVR等平台上找到一些常见的V......
  • 你想知道什么是数据科学吗?阅读此内容以了解。
    你想知道什么是数据科学吗?阅读此内容以了解。介绍在随机的一天,您只需进入您的Instagram,点击用户故事并收到一些关于您正在搜索的原声吉他的广告。之后,您的屏幕上会出......
  • 导出模板设置其中某一列下拉选
    导出模板设置其中某一列下拉选 *设置下拉选 */ for(inti=0;i<headers.length;i++){ Stringheader=headers[i]; if(header.equals("电站简称")){ Str......
  • 拿来即用的下载Excel模板
    模板导出拿来即用 @PostMapping("/templateExport") @ApiOperation(value="模板导出",notes="作者:yysd") publicReturnObjectexportAuditContent(HttpServletRe......
  • MLops:我最喜欢的数据科学项目的 Github 项目模板
    MLops:我最喜欢的数据科学项目的Github项目模板source:unsplash.com-@yancyminTLDR:在这个故事中,我将分享一个git项目结构,我经常将其用作数据科学项目的起点,并......
  • 【django学习-08】视图之HttpResponse文件下载
    一:前言:响应内容除了返回网页信息外,还可以实现文件下载功能,是网站常用的功能之一。Django提供三种方式实现文件下载功能,分别是HttpResponse,StreamingHttpResponse和FileRe......