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

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

作者:互联网

学习内容概要

内容详细

网页伪静态

视图层

#  在视图层处理函数返回值的时候 目前需要使用三板斧去处理返回值  如果不处理 一般情况下就会返回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))




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(如列表、元祖、集合...)


	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会自动根据请求方式的不同匹配类中定义的方法并自动执行
         """




 	源码分析入口
    	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,'inner.html',locals())
 #  在 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模板语法中的符号就两个 一个{{}} 一个{%%}

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


"""
# 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 代替接收




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()

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

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


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


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



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