今日内容详细
目录视图层
视图层之三板斧
用来处理请求的视图函数都必须返回HttpResponse对象
这是正确的
学会看源码:
class Httpresponse:
pass
return HttpResponse()
def render():
return HttpResponse()
return render()
def redirect():
redirect_class = 类(祖先有个类是HttpResponse)
return redirect_class()
return redirect()
JsonResponse对象
JsonResponse主要序列化字典
针对非字典的其他可以被序列化的数据需要修改safe参数为False
from django.http import JsonResponse
def index_func(request):
# 返回给浏览器一个json格式的字符串
user_dict = {'name': 'jason老师', 'age': 18}
# import json
# user_json = json.dumps(user_dict, ensure_ascii=False)
# return HttpResponse(user_json)
return JsonResponse(user_dict, json_dumps_params={'ensure_ascii':False})
默认值更改之后即可显示汉字
ps:以后写代码很多时候可能需要参考源码及所学知识扩展功能
源码:
class JsonResponse():
def __init__(self,data,json_dumps_params=None):
json.dumps(data,**json_dumps_params)
视图层之request对象获取文件
form表单携带文件类型的数据需要做到以下几点
1.method必须是post
2.enctype必须是multipart/form-data
前端:
<form action="" method="post" enctype="multipart/form-data">...</form>
django后端需要通过request.FILES获取文件类型的数据
后端:
request.POST # 获取普通数据(输入、选择)
request.FILES # 获取文件
获取文件:
file_obj = request.FILES.get('file')
with open(r'%s' % file_obj.name, 'wb') as f:
for line in file_obj: # 文件对象支持for循环一行行读取内容
f.write(line)
视图层之FBV与CBV
FBV
基于函数的视图
def index(request):return HttpResponse对象
CBV
基于类的视图
from django import views
class MyLoginView(views.View): # 固定语法
def get(self, request):
return HttpResponse('from CBV get function')
def post(self, request):
return HttpResponse('from CBV post function')
路由层:
path('login/', views.MyLoginView.as_view())
会自动根据请求方法的不同自动匹配对应的方法并执行
CBV源码剖析
1.从CBV的路由匹配切入
path('login/', views.MyLoginView.as_view())
1.类名点名字(名字的查找问题)
2.类名点名字并加括号调用(静态方法、绑定给类的方法)
2.函数名加括号执行优先级最高 项目一启动就会自动执行as_view方法
path('login/', views.view) # CBV路由本质还是FBV
3.浏览器地址栏访问login路由需要执行view函数
1.产生我们自己编写类的对象
2.对象调用dispatch方法(注意查找顺序)
4.研究父类中的dispatch方法
获取当前请求方法并转小写 之后利用反射获取类中对应的方法并执行
查看源码:
class View:
@classmethod
def as_view(cls, **initkwargs):
def view(request, *args, **kwargs):
self = cls(**initkwargs) # cls是我们自己定义的类 产生我们自己编写的类的对象
return self.dispatch(request, *args, **kwargs)
def dispatch(self, request, *args, **kwargs):
handler = getattr(self, request.method.lower()) # getattr根据字符串获取对象对应的属性名(值)或方法名(函数体代码)
return handler(request, *args, **kwargs) # 执行反射之后获取到的方法(八大提交方式之一)并
模板层
"""
{{}}:主要与数据值相关
{%%}:主要与逻辑相关
django的模板语法是自己写的 跟jinja2不一样
1.针对需要加括号调用的名字 django模板语法会自动加括号调用 只需要写名字就行
2.模板语法的注释前端浏览器是无法查看的
{##}
"""
模板语法之传值操作
def mixi(request):
name = 'jason'
age = 18
return render(request, 'demo02.html', {'n1':name, 'a1': age}) # 传值方式1:精准传值 不浪费资源针对多资源的传递书写麻烦
return render(request,'demo02.html', locals()) # 传值方式2:将函数名称空间中所有的名字全部传递 名字过多并且不使用的的情况下比较浪费资源
模板语法之传值特性
1.基本数据类型正常展示
2.文件对象也可以展示并调用方法
3.函数名会自动加括号执行并将返回值展示到页面上(不支持额外传参)
4.类名也会自动加括号调用
5.对象则不会
ps:针对可以加括号调用的名字模板语法都会自动加括号调用
模板语法之过滤器(内置函数)
<h1>过滤器</h1>
<p>统计长度:{{ s|length }}</p>
<p>默认值(第一个参数布尔值是True就展示第一个参数的值否在展示冒号后面的值):{{ b|default:'啥也不是' }}</p>
<p>文件大小:{{ file_size|filesizeformat }}</p>
<p>日期格式化:{{ current_time|date:'Y年-m月-d日 H时:i分:s秒' }}</p>
<p>切片操作(支持步长):{{ l|slice:'0:4:2' }}</p>
<p>切取字符(包含三个点):{{ info|truncatechars:9 }}</p>
<p>切取单词(不包含三个点 按照空格切):{{ egl|truncatewords:9 }}</p>
<p>切取单词(不包含三个点 按照空格切):{{ info|truncatewords:9 }}</p>
<p>移除特定的字符:{{ msg|cut:' ' }}</p>
<p>拼接操作:{{ l|join:'$' }}</p>
<p>拼接操作(加法):{{ n|add:10 }}</p>
<p>拼接操作(加法):{{ s|add:msg }}</p>
<p>支持纯汉字转义:{{ hhh|safe }}</p>
<p>支持标签转义:{{ sss|safe }}</p>
标签:return,request,视图,django,json,def,模板
From: https://www.cnblogs.com/qian-yf/p/16980535.html