自我总结45
view.py 视图层
JsonResponse
HttpResponse 返回字符串
render 返回html页面 给html页面传值
redirect 重定向
视图函数必须有一个返回值 并且返回值的数据类型必须是HttpResponse对象
前后端分离,数据交互 该如何进行?
通常情况下前后端数据交互采用的都是json的字符串(字典)
后端只需要要写好响应的url接口前端访问你这个接口
你只需要返回一个大字典即可 +开发文档
前后端序列化反序列都用哪些方法
python后端 | js |
---|---|
json.dumps | JSON.stringify |
json.loads | JSON.parse |
JsonResponse
默认只能序列化字典类型,如果想序列化其他json能够支持的格式,需要加一个参数safe =Flase
当你的数据有中文的时候,如果你不想自动转码,你需要定制一个参数来告诉你需要动内部任何数据
借助于原生的json模块作为参考依据
json.dumps(obj,ensure_ascii=False)
阅读源码 发现 json_dumps_params = {}
json.dumps(obj,cls,**json_dumps_params)
得出:
JsonResponse(obj,json_dumps_params={'ensure_ascii':False})
FBV和CBV
FBV: 基于函数的视图
CBV:基于类的视图
# 只要是处理前端请求的业务逻辑的视图函数 都需要加上request形参
from django.views import View
class MyLogin(View):
def get(self,request):
return render(request,'login.html')
def post(self,request):
return HttpResponse('post请求')
urs.py
url(r'^login/',views.MyLogin.as_view())
# 1.函数名加括号执行优先级最高
# 2.该方法要么是普通函数 要么是绑定给类的方法
自动变形
url(r'^login/',views.view)
内部源码
def as_view(cls,**kwargs):
def view(...):
self = cls(...) # 生成自己写的类的对象
return self.dispatch(...) # 一定要确认self到底是谁
# 然后一定要问你一句 对象查找属性和方法的顺序(慢)
return view
# 一旦用户敲了login 会自动加括号调用view函数
def dispatch(...)
# 先判断当前请求方式在不在默认的八个请求方法内
if request.method.lower() in self.http_method_allowed:
# 利用反射 获取到方法名对应的属性或者是方法
handler = getattr(self,request.method.lower(),error)
else:
# 提示报错
handler = self.http_method_not_allowed
return handler(...) # 调用请求方法所对应的函数
如何给CBV加装饰器
django推荐你使用内置的模块来给CBV加装饰器
from django.utils.decorators import method_decorator
# 1.直接在类上面装
method_decorator(wrapper,name='给类内部哪个方法装')
# 2.直接在类的内部方法上装
method_decorator(wrapper)
# 3.给类内部所有的方法都装 重写dispacth方法
method_decorator(wrapper)
模板层
模板语法
两种格式
{{ }}
变量相关
{% %}
逻辑相关
模板语法传值
python所有的基本数据类型全部支持传值
传对象
{{ obj }}直接传对象 显示的是对象的内容地址 定义__str__来控制对象的展示
对象在html页面上可以调用绑定方法
传类名
{{ MyClass }}会自动加括号实例化 产生对象
传函数名
{{ index1 }}会自动加括号调用 并且函数如果需要参数 那么模板语法不支持
模板语法过滤器
会自动将 左边的数据当前过滤器的第一个参数传入|右边当作第二个参数
(最多只能有两个参数)
过滤器(提供了一些内置的方法) | 解释 |
---|---|
{{ s|length }} | 统计长度(如果无法统计默认返回0) |
{{ n|add:f }} | 加法运算 (内部异常捕获 支持数字相加 字符串拼接 都不符合返回空) |
{{ l|slice:'0:6:2' }} | 切片操作 顾头不顾尾 也支持步长 |
{{ is_value|default:'is_value变量名指向的值为空' }} | 判断是否有值(有值展示值本身 没值展示默认值) |
{{ file_size|filesizeformat }} | 自动转成文件大小格式 |
{{ s|truncatechars:8 }} | 截取文本内容(字符) 截取五个字符 三个点也算 |
{{ s1|truncatewords:5 }} | 截取文本内容(按照空格计算) 截取五个单词 三个点不算 |
{{ sss|safe }} | 展示带有标签的文本 |
模板语法取值 只有一种方式 统一采用句点符
{{ comp_dic.hobby.2.2.age }}
前后端取消转义的方法
前端
|safe
后端
from django.utils.safestring import mark_safe
res = mark_safe('<a href='htttp://www.baidu.com'>点我</a>')
模板语法标签
if
for循环
# for和if 联合使用
{% for foo in l %}
{% if forloop.first %}
<p>这是我的第一次</p>
{% elif forloop.last %}
<p>这是最后一次了啊</p>
{% else %}
<p>{{ foo }}</p>
{% endif %}
{% empty %}
<p>当for循环的对象是空的时候会走</p>
{% endfor %}
模板语法的取值 只有一种方式 统一采用句点符
{{ comp_dic.hobby.2.2.age }}
自定义过滤器和标签
django支持用户自定义,必须要先有三部准备
1.在应用名下新建一个名字必须交templatetags的文件夹
2.在该文件内 新建一个任意名称的py文件
3.在该py文件的必须写两句话
from django.template import Library
register = Library()
# 之后就可以利用register来自定义过滤器和标签
自定义标签的使用 可以接收多个参数 参数与参数之间必须空格隔开
@register.simple_tag(name='mytag')
def mytag(a,b,c,d):
return '%s?%s?%s?%s'%(a,b,c,d)
自定义inclusion_tag
是一个函数 能够接收外界传入的参数 然后传递给的一个html页面
页面上获得数据 渲染 完成之后
将渲染好的页面 放到调用inclusion_tag
@register.inclusion_tag('mytag.html',name='xxx')
def index666(n):
l = []
for i in range(n):
l.append('第%s项'%i)
return locals() # 将l直接传递给mytag.html页面
模板的继承
先在你想要继承的页面上通过block
划定你将来可能要改的区域
在子页面上先继承extends
利用block
自动提示 选择你想要修改的内容区域
'''
模板上的block区域越多 页面的扩展性越强
一个模板页面至少有三块区域
css区域
html代码区域 可以设置多个block
js区域
有了这三块区域 就能够实现每一个页面都有自己独立的css和js代码
'''
# 例子
{% block css %}
<style>
p {
color: green;
}
</style>
{% endblock %}
{% block content %}
<p>login页面</p>
{% endblock %}
{% block js %}
<script>
alert('login')
</script>
{% endblock %}
# 在子页面上继续沿用父页面的内容
{{ block.super }}
模板的导入
将html页面当做模块的直接导入使用
{% include '名字.html' %}