首页 > 编程语言 >路由分发、名称空间、虚拟环境、视图层三板斧、JsonResponse对象、request对象获取文件、视图层FBV与CBV的源码剖析、模版层简介

路由分发、名称空间、虚拟环境、视图层三板斧、JsonResponse对象、request对象获取文件、视图层FBV与CBV的源码剖析、模版层简介

时间:2022-12-13 22:34:30浏览次数:69  
标签:return 三板斧 视图 虚拟环境 HttpResponse path 路由 view

今日内容详细

路由分发

​ django的每一个应用都可以有自己独立的路由层(urls.py)静态文件(static文件夹)模板层(templates文件夹)

​ 基于这个特性多人开发项目就可以完全解耦和 之后利用路由器分发还可以整合在一起

2608805-20220228160127887-1755896743
  • 路由器分发解决的就是项目的总路由匹配过多的情况

  • 利用路由分发的特性之后 总路由不再干路由与视图函数的直接对应关系

  • 总路由做分发处理 识别当前urls是属于哪个app下的 直接分发到对应的应用去处理

  • 请求来了之后 总路由不做对应关系 只询问你要访问哪个app的功能 然后将请求转发给对应的app去处理

    总路由分发配置

    1.在app目录下创建一个urls.py文件
    2.导入一个include模块(主路由 子路由)
    主路由:
    	from django.urls import path,include
        
        urlpatterns = [
        path('admin/', admin.site.urls),
        #路由分发
        path('app01/',include('app01.urls')),
        #只要是app01的 全部交给app01处理
        path('app02/',include('app02.urls'))
        #只要是app02的 全部交给app02处理
    ]
    子路由正常写 路由与函数视图对应关系
    '''
    在访问的时候要指定是找哪一个app
    ''' 
    

名称空间

路由分发之后 针对相同的别名能不能正确解析出不同的应用前缀
	默认情况下不行
方式一:名称空间
	总路由:path('app01/',include('app01.urls','app01'),namespace='app01'),
    path('app02/',include('app02.urls','app02'),namespace='app02')
	反向解析:
 reverse('app01:index_view')
 reverse('app02:index_view')   

方式二:别名不冲突即可

多个应用别名不冲突可以用应用名作为别名的前缀
path('index/',views.index_func,name='app_01index_view')
path('index/',views.index_func,name='app_02index_view')

虚拟环境

当不同的项目需要使用不同版本的模块时 我们需要用到不同的模块 浪费空间 有些还需要卸载 很麻烦 
虚拟环境和本地环境互不打扰 想用什么模块直接下载
虚拟环境:能够针对相同版本的解释器创建多个分身 每个分身可以有自己独立的环境

pycharm创建

每创建一个虚拟环境就相当于重新下载了一个全新的解释器

微信图片_20221213171948

创建好的虚拟环境:

微信截图_20221213172253

命令行创建

python -m venv pyvebne38

注意:python命令此处不支持多版本共存操作 python27 python36 python38

用命令行创建的时候 要将要使用的python解释器放到最上面
微信截图_20221213173609 image-20221213173728298
创建好了以后 将虚拟环境激活 
要先cd到创建好的目录中的scripts文件下 
执行激活命令:
		activate
关闭指令:
		deactivate

视图层之必会三板斧

用来处理请求的视图函数都必须返回HttpResponse对象

class HttpResponse:
    pass
return HttpResponse()	
'''返回的是HttpResponse加括号产生的对象'''

微信截图_20221213184300

def render():
    return HttpResponse()
return render()
'''返回的是HttpResponse加括号产生的对象'''

微信截图_20221213184523

def redirect():
    redirect_class = 类(祖先有个类是HttpResponse)
    return redirect_class()
return redirect()
'''返回的是HttpResponse加括号产生的对象 '''

微信截图_20221213184936

permanent=False 执行HttpResponseRedirect

HttpResponseRedirect继承了HttpResponseRedirectBase

HttpResponseRedirectBase继承了HttpResponse

JsonResponse对象

import json
def func(request):
    user_dict = {'name':'jason'老师}
    #user_json=json.dumps(user_dict)
    #return HttpResponse(user_json)
    return JsonResponse(user_dict)
ps:写代码的时候多参考源码及所学知识扩展功能

字符编码问题

return JsonResponse(user_dict,json_dumps_params={'ensure_ascii':False})

微信截图_20221213192053

视图层之request对象获取文件

form表单携带文件类型的数据需要做到以下几点
	1.method='POST'
    2.enctype必须是multipart/form-data
django后端需要通过request.LILES获取文件类型的数据

视图层之FBV与CBV

FBV

基于函数的视图

CBV

基于类的视图
    class Myview(views.View):
        def get(self,request):
            return HttpResponse('get')

        def post(self,request):
            return HttpResponse('post')
        
基于类的路由层
	path('class/',views.Myview.as_view())
    会根据请求方法的不同自动匹配对应的方法并执行

CBV源码剖析(*)

1.从CBV的路由匹配切入

path('class/',views.Myview.as_view())
1.类名点名字(名字查找问题 先从对象自身找 然后去产生对象的类 再去父类)
2.类名点名字病假括号调用(静态方法、绑定给类的方法)

2.函数名加括号执行优先级最高 项目已启动就会自动执行as_view方法

微信截图_20221213210855

path('class/',views.Myview.as_view())
			变成
path('class/',views.view)
'''CBV路由本质还是FBV'''

3.浏览器地址栏访问class路由需要执行的view函数

1.产生我们自己编写类的对象
2.对象调用dispatch方法(注意查找顺序 先看自己 再看产生对象的类 在看父类)

微信截图_20221213212708

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)

微信截图_20221213214711

模板层

1.模板语法的传值

传值方式1:
	精准传值 不浪费资源 针对资源多的传递书写麻烦
    {{'n1'=name,'n2'=age}}

传值方式2:
	将函数名称空间中的所有名字全部传递 浪费资源
    locals()将当前试图上的所有名字直接传给页面 

2.模板语法传质特性

1.基本数据类型正常展示
2.文件对象也可以展示并调用方法
3.函数名会自动加括号执行并将返回值展示到页面上(不支持额外传参)
4.类名也会自动加括号调用
5.对象则不会

ps:总结针对可以加括号调用的名字模板语法都会自动加括号调用

3.模板语法之过滤器(内置函数)

{{i|add:1}}     			   i数值自增1
{{s|add:'dig'}} 			   s字符串拼接
{{l|length}}     				l列表统计长度
{{s|slice:'1:4'}}			    索引1切到4   
{{ file_size|filesizeformat } 	将文件大小转换成合适的格式
{{ ctime|date:'Y-m-d H:i:s ' }}	日期格式 x不能用
{{ s|truncatechars:5 }}  		节选字符 后面的参数设置为挤 就会显示鸡哥字符 剩余部分用...表示
{{ s|truncatewords:3 }} 		类似truncatechars,参数设置为几,就会显示单词,剩余部分用三个点表示

 
 
h1 = '<h1>哈哈哈哈</h1>'
s1 = "<script>confirm(123)</script>"
<p>{{ h1|safe }}</p>
<p>{{ s1|safe }}</p>
对变量内的字符串进行html转义(默认情况下是不转义)

标签:return,三板斧,视图,虚拟环境,HttpResponse,path,路由,view
From: https://www.cnblogs.com/lzy199911/p/16980871.html

相关文章

  • Django路由层补充,视图层解析
    目录Django路由层补充,视图层解析今日内容概要今日内容详细路由分发名称空间虚拟环境视图层之必会三板斧前端出现乱码JsonResponse对象视图层之request对象获取文件视图层之......
  • Django之视图层
    目录视图层必会三板斧伪静态(了解)JsonResponse对象request对象获取文件FBV与CBVCBV源码解析模板层视图层django视图层:Django项目下的views.py文件,它的内部是一系列的函......
  • 路由分发 虚拟变量 JsonResponse对象 视图层CBV和FBV 模板层
    今日内容概要路由分发django支持每个应用都可以有自己独立的路由层、静态文件、模板层基于该特性多人开发项目就可以完全解耦合之后利用路由分发还可以整合到一起......
  • django视图层详解
    内容概要路由分发名称空间虚拟环境视图层必会三板斧视图层JsonResponse对象视图层request对象获取文件视图层FBV与CBVCBV源码剖析内容详细路由发分发django支......
  • 进入python的世界_day51_Django之视图层、模板层
    一、路由分发django中应用都可以有自己独立的urls.py文件templates文件夹static文件夹能够让基于django开发的多个应用完全独立便于小组开发能分能收整个dj项目下......
  • Django:视图层
    目录Django视图层编写视图一、视图函数必会三板斧1.HttpResponse()2.render3.redirect二、JsonResponse1.json模块进行序列化2.JsonResponse(1)实例(2)JsonResponse源码学习三......
  • Djiango框架:5、pycharm虚拟环境,视图层之三板斧、JsonResponse对象、request对象、FBV
    Django框架目录Django框架一、pycharm虚拟环境1、简介2、创建方法二、视图层1、视图层必会三板斧2、JsonResponse对象3、视图层之request对象获取文件4、request对象获......
  • django 04 视图层
    视图层三剑客(render,HttpResponse,redirect)#1.用于处理请求的视图函数都必须返回HttpResponse对象"""render,HttpResponse的底层都是HttpResponseredi......
  • django框架——路由分发、名称空间、虚拟环境、视图层
    django框架——路由分发、名称空间、虚拟环境、视图层一、路由分发 django支持每个应用都有自己独立的路由层、静态文件、模板层,基于该特性,多人开发的项目就可以完全的解......
  • 路由分发、名称空间、虚拟环境、视图层之必会三板斧、JsonResponse对象、视图层之requ
    路由分发如果一个django项目特别庞大,里面有很多应用,每个应用下有很多对应关系。那么django自带的路由层里面的代码就会非常非常的多。我们可以根据应用的不同拆分路由对......