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

今日内容详细

路由分发

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

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

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

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

  • 总路由做分发处理 识别当前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创建

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

创建好的虚拟环境:

命令行创建

python -m venv pyvebne38

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

用命令行创建的时候 要将要使用的python解释器放到最上面

image-20221213173728298
创建好了以后 将虚拟环境激活 
要先cd到创建好的目录中的scripts文件下 
执行激活命令:
		activate
关闭指令:
		deactivate

视图层之必会三板斧

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

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

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

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

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})

视图层之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方法

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

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

1.产生我们自己编写类的对象
2.对象调用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)

模板层

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转义(默认情况下是不转义)
posted @ 2022-12-13 22:27  李李大冒险  阅读(46)  评论(0)    收藏  举报
  1. 1 不可撤销
  2. 2 小年兽 程嘉敏
  3. 3 迷人的危险3 FAFA
  4. 4 山楂树之恋 程佳佳
  5. 5 summertime cinnamons / evening cinema
  6. 6 不谓侠(Cover 萧忆情Alex) CRITTY
  7. 7 神武醉相思(翻自 优我女团) 双笙(陈元汐)
  8. 8 空山新雨后 音阙诗听 / 锦零
  9. 9 Wonderful U (Demo Version) AGA
  10. 10 广寒宫 丸子呦
  11. 11 陪我看日出 回音哥
  12. 12 春夏秋冬的你 王宇良
  13. 13 世界が终わるまでは… WANDS
  14. 14 多想在平庸的生活拥抱你 隔壁老樊
  15. 15 千禧 徐秉龙
  16. 16 我的一个道姑朋友 双笙(陈元汐)
  17. 17 大鱼 (Cover 周深) 双笙(陈元汐)
  18. 18 霜雪千年(Cover 洛天依 / 乐正绫) 双笙(陈元汐) / 封茗囧菌
  19. 19 云烟成雨(翻自 房东的猫) 周玥
  20. 20 情深深雨濛濛 杨胖雨
  21. 21 Five Hundred Miles Justin Timberlake / Carey Mulligan / Stark Sands
  22. 22 斑马斑马 房东的猫
  23. 23 See You Again Wiz Khalifa / Charlie Puth
  24. 24 Faded Alan Walker
  25. 25 Natural J.Fla
  26. 26 New Soul Vox Angeli
  27. 27 ハレハレヤ(朗朗晴天)(翻自 v flower) 猫瑾
  28. 28 像鱼 王贰浪
  29. 29 Bye Bye Bye Lovestoned
  30. 30 Blame You 眠 / Lopu$
  31. 31 Believer J.Fla
  32. 32 书信 戴羽彤
  33. 33 柴 鱼 の c a l l i n g【已售】 幸子小姐拜托了
  34. 34 夜空中最亮的星(翻自 逃跑计划) 戴羽彤
  35. 35 慢慢喜欢你 LIve版 戴羽彤
  36. 36 病变 戴羽彤
  37. 37 那女孩对我说 (完整版) Uu
  38. 38 绿色 陈雪凝
  39. 39 月牙湾 LIve版 戴羽彤
像鱼 - 王贰浪
00:00 / 04:45
An audio error has occurred, player will skip forward in 2 seconds.

作词 : 周有才

作曲 : 周有才

这是一首简单的歌

没有什么独特

试着代入我的心事

它那么幼稚

像个顽皮的孩子

多么可笑的心事

只剩我还在坚持

谁能看透我的眼睛

让我能够不再失明

我要记住你的样子

像鱼记住水的拥抱

像云在天空中停靠

夜晚的来到

也不会忘了阳光的温暖

我要忘了你的样子

像鱼忘了海的味道

放下所有梦和烦恼

却放不下回忆的乞讨

多么可笑的心事

只剩我还在坚持

谁能看透我的眼睛

让我能够不再失明

记住你的样子

像鱼记住水的拥抱

像云在天空中停靠

夜晚的来到

也不会忘了阳光的温暖

我要忘了你的样子

像鱼忘了海的味道

放下所有梦和烦恼

却放不下回忆的乞讨

只剩自己就好