首页 > 其他分享 >路由分发 虚拟变量 JsonResponse对象 视图层CBV和FBV 模板层

路由分发 虚拟变量 JsonResponse对象 视图层CBV和FBV 模板层

时间:2022-12-13 22:01:17浏览次数:53  
标签:index JsonResponse request 视图 CBV path 路由 view

今日内容概要

路由分发

django支持每个应用都可以有自己独立的路由层、静态文件、模板层 基于该特性多人开发项目就可以完全解耦合 之后利用路由分发还可以整合到一起

多个应用都有很多路由与视图函数的对应关系 这个时候可以拆分到各自的路由层中

使用路由分发之前 总路由负责操作视图与路由的匹配
	path('index/',index)
使用路由分发之后 总路由只按照应用名分配匹配方向
	path('app01/',include('app01.urls'))  
# 在分配后路由将会到app01下的urls分视图去查找与视图函数的对应关系
'''include也需要从导入 在path后导入即可'''

名称空间

路由分发之后 针对相同的别名能否自动反向解析出不同的应用前缀
	默认情况下是无法直接识别应用前缀
   
如果想要正常识别区分由两种方式、
#方式一:名称空间 
	总路由:
	      path('app01/',include(('app01.urls','app01'),namespace='app01')),
 path('app02/',include(('app02.urls','app02'),namespace='app02'))
	reverse('app01:index_view')
	reverse('app02:index_view')   
'''
命名空间
命名空间(英语:Namespace)是表示标识符的可见范围。

一个标识符可在多个命名空间中定义,它在不同命名空间中的含义是互不相干的。

一个新的命名空间中可定义任何标识符,它们不会与任何重复的标识符发生冲突,因为重复的定义都处于其它命名空间中。

存在问题:路由别名 name 没有作用域,Django 在反向解析 URL 时,会在项目全局顺序搜索,当查找到第一个路由别名 name 指定 URL 时,立即返回。当在不同的 app 目录下的urls 中定义相同的路由别名 name 时,可能会导致 URL 反向解析错误。

解决:使用命名空间。
'''

#方式二:别名不冲突即可(在起别名的时候加上一些特殊前缀)
	path('index/',views.index,name='app01_index_view'),
    path('index/',views.index,name='app02_index_view')
'''
	可以是app的名字作为前缀 也可以使用其他 只要做达到别名不冲突
'''

虚拟环境

使用条件: 想要使用一个版本的python但是使用不同版本的模块版本
#虚拟环境:能够针对相同版本的解释器创建多个分身 每个都可以是独立的
'''类似于应用分身'''
命令行创建虚拟环境:
    python -m venv <名字>
'''在创建的时候如果含有多个版本的python则会选环境变量里最上面的'''
创建完成后的指令(命令行)
	激活
    	activete
	关闭
    	deactivate

在pycharm中创建虚拟环境

image

视图层的三板斧

三板斧:
from django.shortcuts import render, HttpResponse, redirect

#用来处理请求的视图都必须返回HttpResponse对象
	不管发送给前端的是通过render 还是通过HttpResponse 或者是redirect来发送的数据 本质都是返回HttpResponse对象

JsonResponse对象

from django.http import JsonResponse
def index_func(request):
    user_dict = {'name':'xiaochen','age':20}
    return JsonResponse(user_dict)

'''
class JsonResponse():
	def __innt__(self,data,json_dumps_params=None):
		json.dumps(data,**json_dumps_params)
'''
#JsonResponse主要序列化字典 针对非字典的其他可以被序列化的数据需要修改safe参数为Falce

image

视图层之request对象获取文件

form表单携带文件类型的数据需要做到以下几点
	1.method必须是post
 	2.enctype必须是multipart/from_data (from 表单中的属性)
django后端需要通过request.FILES获取文件类型的数据

视图层之FBV与CBV

FBV
	基于函数的视图
 	def index(request):return HttpResponse对象
 
CBV
	基于类的视图
    from django import views
    	class MYLoginView(views.View):
            def get(self,request):
                '''请求为get执行的代码'''
                return HttpResponse对象
           	def post(self,request):
                '''请求为post执行的代码'''
                return HttpResponse对象
# path('login/,views.MyLoginView.as_view()')

CBV源码剖析(重要)

1.从CBV的路由匹配切入
	path('login/',views.MyLogView.as_view())
    	#类名点名字(名字的查找问题)
     	#类名点名字并加括号调用(静态方法、绑定给类的方法)
        '''包含两种情况>>>1.静态方法() 2.绑定给类的方法()'''
2.函数名加括号执行优先级最好 项目启动就会执行as_view方法
	执行结果:
        path('login/',views.MyLogView.as_view())=
        parh('login/',views.view) # CBV路由本质还是FBV
3.浏览器地址栏访问login路由需要执行view函数
	#产生我们自己编写类的对象
 	#对象调用dispatch方法
4.研究父类中的dispatch方法
	获取当前请求方法并转小写 之后利用反射获取类中对应的方法并执行
    
class View:
     @classmethod
     def as_view(cls, **initkwargs):
        def view(request, *args, **kwargs):
            self = cls(**initkwargs)
            return self.dispatch(request, *args, **kwargs)
     def dispatch(self, request, *args, **kwargs):
         handler = getattr(self, request.method.lower())
         return handler(request, *args, **kwargs)

模板层

'''
{{}}:主要与数据值相关
{%%}:主要与逻辑相关

django的模板语法是自己写的 跟jinja2不一样

1.针对需要加括号调用的名字 django模板语法会自动加括号调用
2.模板的注释前端浏览器是无法查看的{##}
3.无法携带参数传入
'''

1.模块语法传值
	#方式一:
    return render(request,'demo02.html',{'n1':name,'a1':age})
	'''精确传值 不浪费资源 但是如果资源过多书写起来就麻烦'''
    #方式二:
    return render(request,'demo02.html',locals())
	'''将函数名称空间所有名字传递 名字过多不使用就比较浪费资源'''
    
2.模板语法传值得特性
	#基本数据类型是正常展示
 	#文件对象也可以展示并调用文件对象的一些方法
 	#函数(类也会)会自动加括号执行返回值传递到页面(不支持额外传参)
  	'''针对可以加括号的都会自动加括号调用'''
  
3.模板语法值过滤器(内置函数)
	#下表所示
过滤器 用法 代码
last 获取列表/元组的最后一个成员 {{liast | last}}
first 获取列表/元组的第一个成员 {{list|first}}
length 获取数据的长度 {{list | length}}
defualt 当变量没有值的情况下, 系统输出默认值, {{str|default="默认值"}}
safe 让系统不要对内容中的html代码进行实体转义 {{htmlcontent| safe}}
upper 字母转换成大写 {{str | upper}}
lower 字母转换成小写 {{str | lower}}
title 每个单词首字母转换成大写 {{str | title}}
date 日期时间格式转换 `{{ value
cut 从内容中截取掉同样字符的内容 {{content | cut:"hello"}}
list 把内容转换成列表格式 {{content | list}}
add 加法 {{num| add}}
filesizeformat 把文件大小的数值转换成单位表示 {{filesize | filesizeformat}}
join 按指定字符拼接内容 {{list| join("-")}}
random 随机提取某个成员 {list | random}}
slice 按切片提取成员 {{list | slice:":-2"}}
truncatechars 按字符长度截取内容 {{content | truncatechars:30}}
truncatewords 按单词长度截取内容 同上

标签:index,JsonResponse,request,视图,CBV,path,路由,view
From: https://www.cnblogs.com/xiaochenxiangchangpang/p/16980766.html

相关文章