热门标签 | HotTags
当前位置:  开发笔记 > 后端 > 正文

django4/网页伪静态/视图层/模板层

网页伪静态动态页动态网页,页面代码虽然没有变,但是显示的内容却是可以随着时间、环境或者数据库操作的结果而发生改变的。静态页即静态网页,是实际存在的,无需经过服务器的编译,

网页伪静态

动态页

动态网页,页面代码虽然没有变,但是显示的内容却是可以随着时间、环境或者数据库操作的结果而发生改变的。

静态页

即静态网页,是实际存在的,无需经过 服务器 的 编译 ,直接加载到客户 浏览器 上显示出来。

特点

1、静态网页每个网页都有一个固定的URL,且网页URL以.htm、.html、.shtml等常见形式为后缀,而不含有“?”。2、静态网页是实实在在保存在服务器上的文件,每个网页都是一个独立的文件。

3、静态网页的内容相对稳定,因此容易被搜索引擎检索;

-------------缺点--------------------------------------------------------------

4、静态网页没有数据库的支持,在网站制作和维护方面工作量较大,因此当网站信息量很大时完全依靠静态网页制作方式比较困难;

5、静态网页的交互性较差,在功能方面有较大的限制。

6、页面浏览速度迅速,过程无需连接数据库,开启页面速度快于动态页面。

7、减轻了服务器的负担,工作量减少,也就降低了数据库的成本。

伪静态页

将动态网页伪装成静态网页,从而提升网页被搜索引擎收录的概率

表现形式就是网址看着像一个具体的文件路径

-------------=--------------------
#路由层urls.py可以直接写一个。
path('index.html',view.index)

伪静态页的缺点

使用伪静态将占用一定量的CPU占有率,大量使用将导致CPU超负荷;

降低服务器访问承载量比如服务器能承载1000人,开启大量伪静态后,三百人。


视图层

每新添加一个功能都应该在路由文件 urls.py 中添加一个路由与视图的对应关系(请求路径的时候才有对应的 视图函数/类 去处理)

最简单的步骤:

先创建app

配置路由(路由与视图函数的对应关系)

写视图函数(要用到 HttpResponse, redirect,记得自己导过来)

编写模板页面


1.视图层返回值问题,必须返回一个什么?

当我们在视图层返回None,或者不返回时,页面报错,需要我们必须返回一个HttpResponse对象

小疑问?

那么视图层,三板斧中,除了返回HttpResponse我们比较觉得合理

返回的render和redirect为什么不报错呢?底层源码其实他俩调用的也是HttpResponse对象

from django.shortcuts import render, HttpResponse,redirect
#以下是部分源码
class HttpResponse(HttpResponseBase):
pass
-----------render源码中也是返回的HttpResponseBase对象-------------------------------------
def render(request, template_name, cOntext=None, content_type=None, status=None, using=None):
"""
Return a HttpResponse whose content is filled with the result of calling
django.template.loader.render_to_string() with the passed arguments.
"""
cOntent= loader.render_to_string(template_name, context, request, using=using)
return HttpResponse(content, content_type, status)
----------------redirect源码中也是返回的HttpResponseBase对象---------------------------------------
def redirect(to, *args, permanent=False, **kwargs):
redirect_class = HttpResponsePermanentRedirect if permanent else HttpResponseRedirect
return redirect_class(resolve_url(to, *args, **kwargs))

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

小需求:不借助模板语法,视图层返回数据给浏览器,如图

1662114820570

两种方法

1.借助httpResponsejsondump

user_dict = {'name': 'lzl', 'pwd': 1111, 'hobby': ['read', 'music']}
json_str = json.dumps(user_dict, ensure_ascii=False) #有中文的情况,把转码关闭掉。
return HttpResponse(json_str)

2.借助JsonResponse [用这个]

from django.http import JsonResponse
def index(request):
user_dict = {'name': 'lzl中文不转码', 'pwd': 1111, 'hobby': ['read', 'music']}
return JsonResponse(user_dict)

return JsonResponse(user_dict, json_dumps_params={'ensure_ascii':False}) #中文不转码

如果想返回非字典类型数据

序列化非字典类型的数据还需要指定safe参数为False

from django.http import JsonResponse
def index(request):
l1 = [1,2,3,4,5,6,7,8,'lzl牛']
return JsonResponse(l1, json_dumps_params={'ensure_ascii':False},safe = False)

JasonResponse是源码底层封装json

def __init__(self, data, encoder=DjangoJSONEncoder, safe=True,
json_dumps_params=None, **kwargs):
if safe and not isinstance(data, dict):
raise TypeError(
'In order to allow non-dict objects to be serialized set the '
'safe parameter to False.'
)
if json_dumps_params is None:
json_dumps_params = {}
kwargs.setdefault('content_type', 'application/json')
data = json.dumps(data, cls=encoder, **json_dumps_params)
super().__init__(cOntent=data, **kwargs)

3. form表单携带文件数据

小需求:浏览器上传文件数据,通过前端传给后端数据

1.前端form表单

2.后端

​ form表单需要具备的条件

​ 1.method 属性必须是post

​ 2.enctype属性必须是multipart/form-data


​ 3.后端获取文件数据的操作

​ request.FILES

#示例 获取
#v
file_obj = request.FILE.get('file')
print(file_obj.name)
with open(file_obj.name, 'wb') as f:
for line in file_obj:
f.write(line)
return render(request,'index.html')

4.FBV与CBV[核心重点]

FBV:基于函数的视图

CBV:基于类的视图



FBV示例

#urls.py路由层
from django import views
urlpatterns = [
path('admin/', admin.site.urls),
path('index/', view.index),
]
#views视图层
from django import views
def index(request):
return HttpResponse()

CBV示例

#urls.py路由层
from django import views
urlpatterns = [
path('admin/', admin.site.urls),
path('index/', view.index),
path('func/', views.MyView.as_view()),
]
#views视图层
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会自动根据请求方式的不同匹配类中定义的方法并自动执行


模板层

1.模板语法传值两种方式

方式1:指名道姓传参,不浪费资源,

def modal(request)
name = 'lzl'
return render(request,'modal.html',{'name':name})

方式二:关键字local() 将整个局部名称空间中的名字去全部 传入简单快捷

def modal(request)
name = 'lzl'
age = '18'
time = '7'
return render(request,'modal.html',locals())

2.模板语法传值范围特性

1.基本数据类型(整型,浮点型,字符串,元组,列表)直接传递使用

#基本数据类型
#路由层
--------------------------------views.py--------------------------------------------
def modal(request):
i = 123
f = 11.11
s = 'hello world'
l = [11, 22, 33]
d = {'name':'jason', 'pwd':123, 'others':[11, {'a':123, 'b':[111, 222, 333]},22]}
t = (11, 22, 33)
se = {11, 22, 33}
b = True
return render(request,'modal.html')

#模板层
-------------------------------modal.html--------------------------------------------









内容
{#

{{ i }}

#}
{#

{{ f }}

#}
{#

{{ s }}

#}
{#

{{ l }}

#}
{#

{{ d }}

#}
{#

{{ t }}

#}
{#

{{ se }}

#}
{#

{{ b }}

#}
{#

{{ d.name }}

#}
{#

{{ l.2 }}

#}
{#

{{ d.others.1.b.2 }}

#}

2.函数名的传递会自动加括号执行并返回值展示到页面上

def modal(request):
def func1():
print('哈哈哈')
return '你到底行不行'

{{ func1 }}


------页面展示效果------------
你到底行不行

3.注意函数如果有参数则不会执行也不会展示,模板语法不支持有参函数

def modal(request):
def func1(a,b):
print('哈哈哈')
return '你到底行不行'

{{ func1 }}


------页面不展示效果(模板语法不支持传参)------------

4.类名的传递也会自动加括号产生对象并展示到页面上

def modal(request):
class MyClass(object):
def get_obj(self):
return 'obj'
@classmethod
def get_cls(cls):
return 'cls'
@staticmethod
def get_func():
return 'func'
obj = MyClass()


----------------模板层modal.html--------------------------------------------
#前端 body内容

{{ MyClass }}


#名的传递也会自动加括号产生对象并展示到页面上
如果类调用打印对象

{{ obj.get_obj }}

{{ obj.get_cls }}

{{ obj.get_func }}


5.对象的传递则直接使用即可

#前端 body内容

{{ obj }}


ps:模板语法会判断每个名字是否可调用,如何可以则调用

注意!!!

django的模板语法在操作容器类型的时候只允许使用句点符


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

过滤器大概有五六十个,我们简单的罗列一些。

#路由层
--------------------------------views.py-------------------------
def modal(request):
i = 123
f = 11.11
s = 'hello world'
l = [11, 22, 33]
d = {'name':'jason', 'pwd':123, 'others':[11, {'a':123, 'b':[111, 222, 333]},22]}
t = (11, 22, 33)
se = {11, 22, 33}
b = True
from datetime import datetime
#日期
res = datetime.today()
#文件大小
file_size = 214324322432344353234

return render(request,'modal.html')
=================modal.html==================================
#模板层body内容

统计长度:{{s|length}}

加法运算:{{i|add:123}}、加法运算:

s|add:'heiheihei'

日期转换:{{s|date:'Y-m-d H:i:s'}}

文件大小:{{file_size|filesizeformat}}

数据切片:{{l|slice:'0:10'}

字符截取:{{s1|truncatechars:6}}

单词截取(一个空格算一个)



重点掌握过滤器

过滤器重点:语法转义

#为什么要加safe参数?

因为前端默认是不加载视图层的脚本标签语法的,如果默认加载,后果就是一旦后端写死循环弹出框,或者不友好的脚本,浏览器会直接崩溃,如果我们写的一定要加载,在后面跟上safe参数即可,告诉前端页面,此代码可以加载。

#视图层
-----------------------视图层view.py-------------------------
def modal(request):
script_tag = '还认识我吗???'
from django.utils.safestring import mark_safe
script_tag1 = ''
res = mark_safe(script_tag1)
return render(request,'modal.html')

----------------------前端模板层modal.html-------------------------------
#body内容

语法转义:{{ script_tag|safe }}

语法转义:{{ script_tag1|safe }}


from django.utils.safestring import mark_safe
script_tag1 = ''
res = mark_safe(script_tag1)

ps:有时候html页面上的数据不一定非要在html页面上编写,也可以后端写好传入

django 模板语法中的符号就两个,一个{{}} 一个{%%}

需要使用数据的时候{{}},类似于上述的取值操作

需要使用方法的时候{%%},类似于之前的反向解析操作


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

以下是常用的,还有一些冷门的了解

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

{% for i in s %}
{% if forloop.first %}

这是第一次哟~


{% elif forloop.last %}

这是最后一次!


{% else %}

{{ i }}


{% endif %}
{% empty %}

你给我的是个空 怎么for循环呢


{% endfor %}

5.自定义相关功能(了解)

一般写全栈的时候会用到。

1.标签函数,

2,过滤器

3.inclusion_tag



如果想自定义 必须先做以下三件事

​ 1.在应用下创建一个名为templatetags文件夹(文件夹名字必须为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 %}

6.模板的继承

1.模板的继承作用?

为了减少代码的编写

2.使用方法

#主模板调用
{% block 名字 %}
模板内容
{% endblock %}

2.把字模板html文件内容清理

3.调用继承文件

#字模板调用
{% etends 'html文件名' %}

4.子板内容修改

{% block 名字 %}
子板内容
{% endblock %}


一般情况下母板中至少应该有三个区域使得扩展性更高!!!

css

content

js

-------#css---------------------------------
{% block css %}
{% endblock %}
-------#content---------------------------
{% block content %}
{% endblock %}

----#js-----------------
{% block js %}
{% endblock %}

'''子板中还可以使用母板的内容 {{ block.super }} '''

7.模板的导入(了解)

​ 将html页面的某个部分当做模块的形式导入使用

{% include 'menu.html' %}


推荐阅读
  • 本文介绍了Hyperledger Fabric外部链码构建与运行的相关知识,包括在Hyperledger Fabric 2.0版本之前链码构建和运行的困难性,外部构建模式的实现原理以及外部构建和运行API的使用方法。通过本文的介绍,读者可以了解到如何利用外部构建和运行的方式来实现链码的构建和运行,并且不再受限于特定的语言和部署环境。 ... [详细]
  • 如何用UE4制作2D游戏文档——计算篇
    篇首语:本文由编程笔记#小编为大家整理,主要介绍了如何用UE4制作2D游戏文档——计算篇相关的知识,希望对你有一定的参考价值。 ... [详细]
  • 本文介绍了在开发Android新闻App时,搭建本地服务器的步骤。通过使用XAMPP软件,可以一键式搭建起开发环境,包括Apache、MySQL、PHP、PERL。在本地服务器上新建数据库和表,并设置相应的属性。最后,给出了创建new表的SQL语句。这个教程适合初学者参考。 ... [详细]
  • PHP设置MySQL字符集的方法及使用mysqli_set_charset函数
    本文介绍了PHP设置MySQL字符集的方法,详细介绍了使用mysqli_set_charset函数来规定与数据库服务器进行数据传送时要使用的字符集。通过示例代码演示了如何设置默认客户端字符集。 ... [详细]
  • 本文介绍了如何使用php限制数据库插入的条数并显示每次插入数据库之间的数据数目,以及避免重复提交的方法。同时还介绍了如何限制某一个数据库用户的并发连接数,以及设置数据库的连接数和连接超时时间的方法。最后提供了一些关于浏览器在线用户数和数据库连接数量比例的参考值。 ... [详细]
  • 本文介绍了在Hibernate配置lazy=false时无法加载数据的问题,通过采用OpenSessionInView模式和修改数据库服务器版本解决了该问题。详细描述了问题的出现和解决过程,包括运行环境和数据库的配置信息。 ... [详细]
  • [译]技术公司十年经验的职场生涯回顾
    本文是一位在技术公司工作十年的职场人士对自己职业生涯的总结回顾。她的职业规划与众不同,令人深思又有趣。其中涉及到的内容有机器学习、创新创业以及引用了女性主义者在TED演讲中的部分讲义。文章表达了对职业生涯的愿望和希望,认为人类有能力不断改善自己。 ... [详细]
  • 关于我们EMQ是一家全球领先的开源物联网基础设施软件供应商,服务新产业周期的IoT&5G、边缘计算与云计算市场,交付全球领先的开源物联网消息服务器和流处理数据 ... [详细]
  • 图解redis的持久化存储机制RDB和AOF的原理和优缺点
    本文通过图解的方式介绍了redis的持久化存储机制RDB和AOF的原理和优缺点。RDB是将redis内存中的数据保存为快照文件,恢复速度较快但不支持拉链式快照。AOF是将操作日志保存到磁盘,实时存储数据但恢复速度较慢。文章详细分析了两种机制的优缺点,帮助读者更好地理解redis的持久化存储策略。 ... [详细]
  • Java String与StringBuffer的区别及其应用场景
    本文主要介绍了Java中String和StringBuffer的区别,String是不可变的,而StringBuffer是可变的。StringBuffer在进行字符串处理时不生成新的对象,内存使用上要优于String类。因此,在需要频繁对字符串进行修改的情况下,使用StringBuffer更加适合。同时,文章还介绍了String和StringBuffer的应用场景。 ... [详细]
  • 本文介绍了高校天文共享平台的开发过程中的思考和规划。该平台旨在为高校学生提供天象预报、科普知识、观测活动、图片分享等功能。文章分析了项目的技术栈选择、网站前端布局、业务流程、数据库结构等方面,并总结了项目存在的问题,如前后端未分离、代码混乱等。作者表示希望通过记录和规划,能够理清思路,进一步完善该平台。 ... [详细]
  • 本文介绍了RPC框架Thrift的安装环境变量配置与第一个实例,讲解了RPC的概念以及如何解决跨语言、c++客户端、web服务端、远程调用等需求。Thrift开发方便上手快,性能和稳定性也不错,适合初学者学习和使用。 ... [详细]
  • 本文介绍了计算机网络的定义和通信流程,包括客户端编译文件、二进制转换、三层路由设备等。同时,还介绍了计算机网络中常用的关键词,如MAC地址和IP地址。 ... [详细]
  • 本文介绍了通过ABAP开发往外网发邮件的需求,并提供了配置和代码整理的资料。其中包括了配置SAP邮件服务器的步骤和ABAP写发送邮件代码的过程。通过RZ10配置参数和icm/server_port_1的设定,可以实现向Sap User和外部邮件发送邮件的功能。希望对需要的开发人员有帮助。摘要长度:184字。 ... [详细]
  • 31.项目部署
    目录1一些概念1.1项目部署1.2WSGI1.3uWSGI1.4Nginx2安装环境与迁移项目2.1项目内容2.2项目配置2.2.1DEBUG2.2.2STAT ... [详细]
author-avatar
孜雪颖2000
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有