-
网页伪静态
实际上伪静态是个动态页面,只是通过技术手段伪装成立静态页面的样子,伪静态页面的内容是通过读取数据库生成的。
将动态网页伪装成静态网页 从而提升网页被搜索引擎收录的概率,表现形式就是网址看着想一个具体的文件路径
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