首页 > 其他分享 >django 4 视图层

django 4 视图层

时间:2022-12-13 20:36:21浏览次数:50  
标签:return request 视图 django json def 模板

今日内容详细

目录

视图层

视图层之三板斧

用来处理请求的视图函数都必须返回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

相关文章

  • 视图层
    昨日内容回顾数据增删改查可视化界面1.request对象方法 request.GET\request.POST\request.method2.数据库迁移命令 makemigrations\migrate3.form表单提交数据......
  • Django4
    路由分发1.django是专注于开发应用的,当一个django项目特别庞大的时候,所有的路由与视图函数映射关系全部写在项目名下urls.py(总路由),很明显太冗余也不便于管理,这个时候也......
  • django框架(部分讲解)
    路由分发django每个应用都可以有自己独立的路由层、静态文件、模板层。基于该特性多人开发项目就可以完全解耦合,之后利用路由分发还可以整合到一起多个应用都有很多路由......
  • python之路48 django 视图层、模板层
    视图层之必会三板斧用来处理请求的视图函数都必须返回HttpResponse对象完全正确classHttpResponse:passreturnHttpResponse()defrender():returnH......
  • django 视图层
    简介:视图层三板斧详解,JsonResponse对象,request对象获取文件,FBV与CBV,CBV源码剖析目录视图层视图层三板斧详解JsonResponse对象request对象获取文件FBV与CBVFBVCBV源码剖析......
  • django之路由分发,名称空间,虚拟环境,视图层之必备三板斧,JsonResponse对象,视图层之reques
    路由分发应用场景:1、Django的每一个应用都可以有自己的templates文件夹,urls.py、static文件夹,正是基于这个特点,Django能够非常好的做到分组开发(每个人只写自己的app),公......
  • django之视图层
    目录视图层之必会三板斧JsonResponse对象视图层之request对象获取文件视图层之FBV与CBVCBV源码剖析(重要)视图层之必会三板斧用来处理请求的视图函数都必须返回HttpRespo......
  • django之模板层
    模板层模板层的两种语法:"""{{}}:主要与数据值相关{%%}:主要与逻辑相关django的模板语法是自己写的与jinja2不一样1.针对需要加括号调用的名字,django模板语法会自......
  • Djangoday之试图层和模板层
    目录Django之视图层及模板层一、路由分发二、名称空间三、虚拟环境四、试图层之必会三板斧五、视图层之JsonRespnse对象六、视图层之request对象获取文件七、视图层之FBV与......
  • Django之路由层
    django请求生命周期流程图django的生命周期是从用户发送HTTP请求数据到网站响应的过程。整个过程的流程包括:浏览器发送HTTP请求——>wsgiref服务——>中间件—......