首页 > 其他分享 >【2022.9.2】Django框架(网页伪静态、视图层、模板层)

【2022.9.2】Django框架(网页伪静态、视图层、模板层)

时间:2022-09-04 22:23:11浏览次数:97  
标签:return 视图 Django 语法 json 模板 2022.9 def

学习内容概要

  • 网页伪静态
  • 视图层
    • 三板斧
    • JsonResponse
    • form表单上传文件
    • FBV与CBV(核心)
    • CBV源代码(面向对象)
  • 模板层
    • 模板语法传值
    • 模板语法之过滤器
    • 模板语法之标签
    • 自定义过滤器、标签、inclusion_tag

内容详细

网页伪静态

  • 本质:
    • 将动态网页伪装成静态的网页 目的是提升网页被搜索引擎收录的概率 (提高搜索查询概率)
    • 表现形式就是把网址的后面加上一个看着像一个具体文件路径的后缀
    • 例如:path('inner.html',views.inner)

视图层

  • 1、视图函数的返回值问题

    • 视图函数必须返回一个 HttpResponse 对象
#  在视图层处理函数返回值的时候 目前需要使用三板斧去处理返回值  如果不处理 一般情况下就会返回None  从而会报错

# 在使用三板斧时 其实本质都是在使用  HttpResponse  去返回  因为:
			# HttpResonse其实是一个类
    
# 验证:
class HttpResponse(HttpResponseBase):
    pass

def render():
    return HttpResponse(content, content_type, status)
            
def redirect(to, *args, permanent=False, **kwargs):
        redirect_class = HttpResponsePermanentRedirect if permanent else HttpResponseRedirect
        return redirect_class(resolve_url(to, *args, **kwargs))




  • 2.视图函数返回json格式数据

user_dict = {'name': 'jason老师', 'pwd': 123, 'hobby': ['read', 'run', 'music']}
# 方法1:
from django.shortcuts import render,reverse,HttpResponse,redirect

import json

def inner(request):
    user_dict = {'name': 'jason老师', 'pwd': 123, 'hobby': ['read', 'run', 'music']}
    json_str = json.dumps(user_dict,ensure_ascii=False)
    return HttpResponse(json_str)

# 方法二:
from django.http import JsonResponse
def inner(request):
    user_dict = {'name': 'jason老师', 'pwd': 123, 'hobby': ['read', 'run', 'music']}

    return JsonResponse(user_dict,json_dumps_params={'ensure_ascii':False})

# 源码表现:
class JsonResponse(HttpResponse):
    def __init__(self, data, encoder=DjangoJSONEncoder, safe=True,
                 json_dumps_params=None, **kwargs):
        if json_dumps_params is None:
            json_dumps_params = {}
        data = json.dumps(data, cls=encoder, **json_dumps_params)

        
        
# 序列化非字典类型的数据还需要指定safe参数为False(如列表、元祖、集合...)


  • 3.form表单携带文件数据

    • 前端 form 表单需要具备的条件
      • 1.method属性值必须是post
      • 2.enctype属性值必须是 multipart/form-data
    • 后端获取文件数据的操作
      • 1.request.FILES
  • 4.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会自动根据请求方式的不同匹配类中定义的方法并自动执行
         """




  • 5.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.模板层语法传值

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

    • (1)基本数据类型直接传递使用(整型、浮点型、字符串、列表、字典、集合、元祖、布尔值)

    • (2)函数名的传递会自动加括号去调用 没有返回值 直接显示 None

      • 如果函数有参数不会执行也不会显示 模板语法不支持有参函数
    • (3)类名的传递会自动加括号生产对象并展示在页面上

      • 对象调用会直接显示在页面上
    • (4)注意:模板语法会判断每一个名字是否可调用 如果可以则直接显示调用

  • 3.模板语法过滤器(类似于python中的内置函数)

 #  在 views 页面写好数据 HTML 页面直接使用模板语法过滤器
    <p>统计长度:{{ s|length }}</p>
    <p>加法运算:{{ i|add:123 }}、加法运算:{{ s|add:'hahaha' }}</p>
    <p>日期转换:{{ s|date:'Y-m-d H:i:s' }}</p>
    <p>文件大小:{{ file_size|filesizeformat }}</p>
    <p>数据切片:{{ l|slice:'0:15' }}</p>  # 索引超出也不会报错 直接显示容器内最后一个数据值
    <p>字符截取(三个点算一个):{{ s1|truncatechars:5 }}</p>
    <p>单词截取(空格):{{ s1|truncatewords:5 }}</p>
        
        # 在后端 ivews 页面直接编写前端标签 在前端页面直接用|safe  去转义就可以使用了
    <p>语法转义:{{ script_tag|safe }}</p>
    <p>语法转义:{{ script_tag1|safe }}</p>
        
        # 下述方法是在后端直接调用模块 编写前端数据  不需要在前端用|safe 转义  也可以直接传入使用
        
    from django.utils.safestring import mark_safe
    script_tag2 = '<script>alert(100)</script>'
    res = mark_safe(script_tag2)
 
"""
django模板语法中的符号就两个 一个{{}} 一个{%%}

	需要使用数据的时候 {{}}
	
	
	需要使用方法的时候 {%%}


"""
  • 4.模板语法标签(类似于python中的流程控制)

    • 关键字:forloop
# if...elif...else


	{% if 条件 %}  条件一般是模板语法传过来的数据  直接写名字使用即可
        条件成立执行的代码
    {% elif 条件1 %}
 		  条件1成立执行的代码	
    {% else %}
       	 条件都不成立执行的代码
    {% endif %}

# for循环套if分支
l = [11,22,33,44,55,66]

    {% for i in l %}
        {% if forloop.first %}
            <p>这是第一次哟~</p>
        {% elif forloop.last %}
            <p>这是最后一次!</p>
        {% else %}
            <p>{{ i }}</p>
        {% endif %}
        {% empty %}  # 用来判断in后面的数据是否为空
        	<p>in后面数据为空 循环不了</p>
    {% endfor %}
    
# 循环打印的结尾为:数据的头和尾会被 forloop.first和forloop.last 代替接收




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

  • (1)如果想自定义 必须先做以下三件事

  • (2) 在应用下创建一个名为templatetags文件夹

  • (3) 在该文件夹创建任意名称的py文件

  • (4)在该py文件内编写自定义相关代码

    • 先到模块:
      • from django.template import Library
      • register = Library()
from django.template import Library

register = Library()

# 自定义过滤器(过滤器最多两个参数)
@register.filter(name='myfilter')  # 起别名
def my_add(a, b):
    return a + b

# 使用方法:先调用{% load 文件名 %}  {{数据类型|myfilter:数据值}}

========================================================================

# 自定义标签函数(多个参数)
@register.simple_tag(name='mytag')  # 起别名
def func(a, b, c, d):
    return a + b + c + d

# 使用方法:直接在{% mytag 1 2 3 4 %}


=========================================================================
# 自定义inclusion_tag
@register.inclusion_tag(filename='it.html')
def index(n):
    html = []
    for i in range(n):
        html.append('第%s页'%i)
    return locals()

  • 6.模板的继承

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

继承母板:          {{ block.super }}


  • 7.模板的导入
    • 关键字:inclyde
# 创建一个HTML页面 然后编写一些css、js...内容  并且把这块内容当做模板的形式去导入使用


# 导入方法:{% inclyde 'fixed.html'%}



标签:return,视图,Django,语法,json,模板,2022.9,def
From: https://www.cnblogs.com/55wym/p/16656326.html

相关文章

  • Django 环境安装
    Django是基于Python的Web框架,依赖Python环境,所以需要提前安装好Python解释器。关于Python的安装,请参考https://www.liujiangblog.com站点中Python教程的相关部分,这里不再......
  • web框架-django框架
    目录web框架编写web框架模块动静态网页jinjia2模块python主流web框架django框架版本下载安装操作目录结构三板斧静态文件操作form表单request对象方法MySQL数据库连接ORM数......
  • django框架-4
    目录网页伪静态视图层模板层网页伪静态将动态网页伪装成静态网页从而提升网页被搜索引擎收录的概率(掏点票票更快更能提高搜索频率)表现形式就是网址乍一看像一个具......
  • django4/网页伪静态/视图层/模板层
    网页伪静态动态页动态网页,页面代码虽然没有变,但是显示的内容却是可以随着时间、环境或者数据库操作的结果而发生改变的。静态页即静态网页,是实际存在的,无需经过服务器......
  • 【2022-09-02】Django框架(四)
    Django框架(四)Django框架之伪静态概念静态文件:数据是写死,永远不会修改伪静态:将一个动态页面伪装成静态页面#为什么要伪装?伪装的目的在于增大本网站的seo查询力......
  • 2022.9.4 模拟赛
    ForNOIP.谜之阶乘题意:问\(n\)能够被多少组\((a,b)\)表示,满足\(n=\dfrac{a!}{b!}\)。\(n\leq10^{18}\),多组询问。首先猜测\(a-b\)并不大,然后就枚举这个差值......
  • Django 与 Vue 语法冲突问题完美解决方法
    Django与Vue语法冲突问题完美解决方法当我们在djangoweb框架中,使用vue的时候,会遇到语法冲突.因为vue使用{{}},而django也使用{{}},因此会冲突.......
  • 使用 Django 集成 vue 到一个服务器上,还是 Django 和 vue 分开部署
    Django+Vue的项目,实际部署的时候,使用Django集成vue到一个服务器上,还是Django和vue分开部署?目前在架构选择,基本上定了Django+Vue但是实际部署的时候,就有两种......
  • Django基础介绍二
    数据的查,改,删先讲数据库中的数据全部展示到前端然后给每一个数据两个按钮一个编辑一个删除查看defuserlist(request):#查询出用户表里面所有的数据#方式1#data......
  • 2022.9.3
    现在是2022.9.3,进入大三了。上半年的计划没怎么实现,太容易被外界干扰。时间不是很多,技术栈还有很大欠缺。今天听了很久很久,人也总要向前看的。现在的我没有时间可以再......