目录标题
一:网页伪静态
1.定义
把动态网页伪装成静态网页,从而提升网页被搜索引擎收录的概率
2.如何实现
在路由层写url的时候加上网页文件的后缀名
path('login.html', views.login)
二:视图层
1.视图函数返回值问题
1.HttpResponse其实是一个类
2.通过查看源码得出,视图层必须返回一个HttpResponse对象
2.视图层返回json格式的数据
1.JsonResponse:可以把后端的数据封装成Json,传到前端页面
2.通过查看源码,得到JsonResponse方法的两个重要参数:json_dumps_params={‘ensure_ascii’:False} 和 safe=False
- json_dumps_params={‘ensure_ascii’:False}:取消编码
def index(request):
dict1 = {'name': 'wang', 'age': 18, 'hobby':'唱歌'}
return JsonResponse(dict1, json_dumps_params={'ensure_ascii': False})
- safe=False:允许非字典类型数据安全展示
def index(request):
list1 = [11, 33, 55, 66]
return JsonResponse(list1, safe=False)
3.form表单携带文件数据
1.后端想要从前端得到提交过来的文件数据,必须做以下准备
- 1.method属性值必须是post
- 2.enctype属性值必须是:multipart/form-data
2.后端获取文件数据的方法
- request.FILES
- request.FILES.get(‘nam文件名’)
file_obj = request.FILES.get('file')
with open('file_obj.name', 'wb') as f:
for line in file_obj:
f.write(line)
4.CBV源码分析
1.CBV和FBV:
- CBV:基于函数的视图
def index(requet):
return HttpResponse('你好哦')
- FBV:基于类的视图
from django import views
class MyView(views.View):
def get(self, request):
pass
def post(self, request):
pass
2.CBV源码分析:
- 1.从as_view方法着手
path('cbv/', views.Cbv.as_view()),
- 2.进入查看as_view方法
def as_view(...):
return view
- 3.由于as_view函数的的返回值是view这个函数名,所以上述的url可以写成是
path('cbv/', views.Cbv.view),
- 4.当url匹配到内容的时候,会调用函数view,由于我们自己写的cbv中没有view函数,所以去继承的父类中查看
def view(request, *args, **kwargs):
return self.dispatch(request, *args, **kwargs)
- 5.view函数的返回值是dispatch方法,这个方法我们自己写的类中没有,继续去父类中查找
def dispatch(...):
func_name = getattr(obj,request.method.lower())
# handler = getattr('自定义的类的对象',‘类中的方法’)
return handler(...) # 这里直接调用我们自己写的类中的方法
- 结论:CBV的本质其实就是FBV
三:模板层
1.模板语法传值
1.方式一:指名道姓,节省资源
return render(request, 'home.html', {'name':name, 'age':age})
2.方式二:整体传值
return render(request, 'home.html', locals())
2模板语法的传值范围
1.基本数据类型:支持python中所有的数据类型,直接传递使用
2.函数名:会自动加括号执行,并把函数的返回值展示到页面上(不支持有参函数)
3.类名:会自动加括号产生对象,展示到前端页面上
4.对象:直接传递使用即可
总结:模板语法会判断每一个名字是否可调用,如果可以则直接调用
3.模板语法之过滤器
基本过滤器 | 功能 | 使用 |
---|---|---|
length | 统计长度 | {{ s | length }} |
add | 加法运算 | {{ i | add: 123}} |
date | 日期转换 | {{ s | date: 'Y-m-d H:i:s ’ }} |
filesizeformat | 文件大小 | {{ file | filesizeformat }} |
slice | 数据切片 | {{ l | slice: ‘0 : 10’}} |
truncatewords | 单词截取(以空格) | {{ s1 | truncatewords: 6}} |
truncatechars | 字符截取(三个点算一个) | {{ s1 | truncatechars: 6}} |
safe | 语法转义(后端写的前端页面别允许展示) | {{ script_tag | safe}} |
4.语法转义:
- 有时候html页面上的数据不一定非要在html页面上编写了 也可以后端写好传入
from django.utils.safestring import mark_safe
script_tag = '<script>alert(111)</script>'
res = mark_safe(script_tag)
5.模板语法标签(类似于python中的流程控制)
- if 判断:条件一般是模板语法传过来的数据 直接写名字使用即可
{% if 条件 %}
条件成立执行的代码
{% elif 条件1 %}
条件1成立执行的代码
{% else %}
条件都不成立执行的代码
{% endif %}
- for 循环
{% for i in s %}
{% if forloop.first %}
<p>第一次</p>
{% elif forloop.last %}
<p>最后一次</p>
{% else %}
<p>{{ i }}</p>
{% endif %}
{% empty %}
<p>当结果为空时,执行</p>
{% endfor %}
6.自定义标签函数、过滤器、inclusion_tag
1.自定义过滤器
1.步骤:
- 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
# 下面时需要写在前端的代码
{% load mytag %}
{{ i|myfilter:1 }}
2.自定义标签函数
@register.simple_tag(name='mt')
def func(a, b, c, d):
return a + b + c + d
# 下面时需要写在前端的代码
{% load mytag %}
{% mt 1 2 3 4 %}
3.自定义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 %}
{% index 10 %}
7.模板的继承
1.被继承版中的操作:继承3个区域:css, js, content
{% block css %}
{% endblock %}
{% block content %}
{% endblock %}
{% block js %}
{% endblock %}
2.新html页面中的操作
{% extends 'html文件名' %}
{% block 名字 %}
自定义模板内容
{% endblock %}
3.子模版中还可以使用母版中的内容
{{ block.super }}
8.模板的导入
将html页面的某个部分当做模块的形式导入使用
{% include 'a.html' %}