目录
路由层
网页伪静态
1.定义:动态网页通过重写URL的方法去掉动态网页的参数 但实际页面还是动态页面(动态页面欺骗浏览器让浏览器认为该页面内容数据是固定不变的 让浏览器收录 用来提高搜索后展示的概率)
2.方法:将展示页面的后缀名添加文件后缀展示
视图层
视图函数返回值
1.视图函数:必须返回一个HttpResponse对象
2.三板斧
rander返回的是HttpResponce对象:return HttpResponse(content, content_type, status)
redirect返回是HttpResponse对象:redirect_class = HttpResponsePermanentRedirect if permanent else HttpResponseRedirect
return redirect_class(resolve_url(to, *args, **kwargs))
HttpResponse是一个类: class HttpResponse(HttpResponseBase):
django序列化方法
1.序列化方法
1.1 Json方法:存在中文需转换
(ensure_ascii=False)
import json
def mylist(request):
info = {'name': 'lili童鞋', 'age': 22}
# l1 = json.dumps(info) # {"name": "lili\u7ae5\u978b", "age": 22}
l1 = json.dumps(info, ensure_ascii=False) # {"name": "lili童鞋", "age": 22}
return HttpResponse(l1)
1.2 JsonResponse方法:继承的是json类
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)
1.2.1 使用JsonResponse方法存在汉字会乱码 可以通过json_dumps_params = {}给它传递实参来解决乱码问题
from django.http import JsonResponse
def mylist(request):
info = {'name': 'lili童鞋', 'age': 23}
# l1 = JsonResponse(info) # {"name": "lili\u7ae5\u978b", "age": 23}
l1 = JsonResponse(info, json_dumps_params={'ensure_ascii': False}) # {"name": "lili童鞋", "age": 23}
return HttpResponse(l1)
1.2.2 当序列化的不是字典类型的数据时报错:In order to allow non-dict objects to be serialized set the safe parameter to False.
需要确认传递的数据是否安全 防止产生错误 导致系统崩溃(如弹框)
def mylist(request):
info = [1, 3, 5]
# l1 = JsonResponse(info) # {"name": "lili\u7ae5\u978b", "age": 23}
l1 = JsonResponse(info, json_dumps_params={'ensure_ascii': False}, safe=False) # [1, 3, 5]
return HttpResponse(l1)
form表单操作
1.携带文件数据具备条件:
1.1 form表单:
method属性值必须是post
enctype属性值必须是multipart/form-data
1.2 后端views:
request.FILES
html代码:
<form action="" method="post" enctype="multipart/form-data" >
<p>username:
<input type="text" name="username"></p>
<p>file:
<input type="file" name="file"></p>
<input type="submit" class="btn-group-xs" value="提交">
</form>
后端views代码:
def myfiles(request):
if request.method == 'POST':
print(request.POST) # <QueryDict: {'username': ['lili']}>
print(request.FILES) # <MultiValueDict: {'file': [<InMemoryUploadedFile: 沐阳晴子.doc (application/msword)>]}>
file_obj = request.FILES.get('file')
with open(file_obj.name, 'wb')as f:
for line in file_obj:
f.write(line)
return render(request, 'func.html')
FBV与CBV
FBV
1.FBV:基于函数的视图
后端代码:
def func(request):
return HttpResponse('橘子蔫了')
路由匹配代码:
path('func/', views.func),
CBV
1.CBV:基于类的视图
后端代码:
from django import views
class Myview(views.View):
def get(self, request):
return HttpResponse('get请求')
def post(self, request):
return HttpResponse('post请求')
路由匹配代码:
path('myview/', views.Myview.as_view())
注:CBV会根据请求的不同而执行不同的方法
2.CBV源码分析: path('myview/', views.Myview.as_view())
2.1 源码分析入口:类.as_view()
as_view加括号说明是一个方法(类点方法)
类继承的查找顺序:先从自己类里找 再到继承的父类里找
2.1 as_view()是在View类下绑定给类的方法
class Myview(views.View) 继承View
View类中的属性:多个请求类型
as_view绑定给类的方法执行后返回view(将创建的类作为第一个参数传入)
2.3 CBV的路由匹配与CBV一致:
path('myview/', views.func)
2.3 路由匹配上之后执行view函数 根据请求不同做判断
self = cls(**initkwargs) # 产生对象
返回:return self.dispatch(request, *args, **kwargs)
2.4 self.dispatch(request, *args, **kwargs)(对象.方法)
查找方法:对象 产生对象的类 继承的父类
View父类中有dispatch函数:判断请求方式在View类的属性中的话 将请求方式转为小写
然后将属性返回
2.5 执行对象.返回的属性
查找属性方法 先从对象自己中找 再到产生的类中查找
我们自己创建的类中有该方法 执行该方法
父类代码: path('myview/', views.Myview.as_view())
@classonlymethod
def as_view(cls, **initkwargs): # 自己创建的类中无该方法 执行父类方法
return view # 返回view
def view(request, *args, **kwargs): # 自己创建的类中无该方法 执行父类方法
self = cls(**initkwargs)
return self.dispatch(request, *args, **kwargs) # 返回dispatch
def dispatch(self, request, *args, **kwargs): # 自己创建的类中无该方法 执行父类方法
if request.method.lower() in self.http_method_names:
handler = getattr(self, request.method.lower(), self.http_method_not_allowed)
else:
handler = self.http_method_not_allowed
return handler(request, *args, **kwargs) # 返回属性值
子类代码:from django import views
class Myview(views.View):
def get(self, request): # 获得返回的请求类型执行
return HttpResponse('get请求')
def post(self, request):
return HttpResponse('post请求')
模板层
模板语法传值
1.传值方式:
1.1 指明道姓
return render(request, 'func.html', {'name': name})
1.2 关键字locals()
2.区别:
2.1 指明道姓:适用于少量传值 不浪费资源 不适用于多值 较麻烦且混乱
2.2 关键字locals():可以一次性将局部名称空间中的值一次传入 不适应与少量传值 浪费资源
注:根据实际情况选择传值方式
3.传值范围
基本数据类型:int float str list dict tuple set bool都可以展示到页面
函数名:自动加括号执行将返回值展示到页面(模板语法只执行无参函数)
类名:自动加括号产生对象并展示到页面
对象:直接展示到页面
注:模板语法会判断每一个名字是否可以调用 可以就执行调用
django的模板语法在操作容器类型时只允许使用句点符
模板语法过滤器
1.过滤器(类似于python内置函数)
类型 | 作用 |
---|---|
{{ s|length }} |
length统计l的长度 |
{{ i|add:123 }} {{ s|add:'qwe' }} |
add数字求和 字符串拼接 |
{{ d|date:'Y-m-d H:i:s' }} |
data日期转换 |
{{ file_size|filesizeformat }} |
filesizeformat文件大小 |
数据切片:{{ t|slice:'0:10' }} |
slice切片 |
{{ b|truncatechars:3 }} |
truncatechars字符截取(显示字符比截取小1个字符) |
{{ s1|truncatewords:6 }} |
truncatewords单词截取(按空格截取) |
{{ mylist|safe }} |
语法转义 |
注:语法转义:有时候html页面上的数据也可以写在后端 可能导致出现错误 因此需要语法转义
from django.utils.safestring import mark_safe
script_tag1 = '<script>alert(999)</script>'
res = mark_safe(script_tag1)
模板语法符号
1.符号:
1.1.使用数据:{{}}
1.2.使用方法:{%%}
模板语法标签
1.标签(类似于python中的流程控制)
1.1 if判断
{% if 条件 %} 条件一般是模板语法传过来的数据 直接写名字使用即可
条件成立执行的代码
{% elif 条件1 %}
条件1成立执行的代码
{% else %}
条件都不成立执行的代码
{% endif %}
1.2 for循环
{% for i in l %}
{% if forloop.first %}
<p>第一次循环</p>
{% elif forloop.last %}
<p>最后一次循环</p>
{% else %}
<p>{{ i }}</p>
{% endif %}
{% empty %}
<p>空</p>
{% endfor %}
自定义相关功能
1.自定义前提:
1.1 在应用下创建一个名为templatetags文件夹
1.2 在该文件夹下创建py文件
1.3 在该文件夹下编写自定义相关代码
from django.template import Library
register = Library()
2.自定义类型
2.1.自定义过滤器
@register.filter(name='myint')
def func(a, b):
return a * b
2.2.自定义标签函数
@register.simple_tag(name='mt')
def func(a, b):
return a + b
2.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 %}
{{ i|myfilter:1 }}
{% mt 1 2 3 4 %}
{% index 10 %}
模板继承
1.模板继承:
{% extends 'html文件名' %}
{% block 名字 %}
模板内容
{% endblock %}
{% block 名字 %}
子板内容
{% endblock %}
一般情况下母板中至少应该有三个区域使得扩展性更高!!!
css content js
{% block css %}
{% endblock %}
{% block content %}
{% endblock %}
{% block js %}
{% endblock %}
'''子板中还可以使用母板的内容 {{ block.super }} '''
模板导入
1.将html页面的某个部分当做模块的形式导入使用
{% include 'func.html' %}
标签:return,04,框架,self,request,django,def,模板,view
From: https://www.cnblogs.com/040714zq/p/16651607.html