Django框架4

今日内容概要

  • 路由分发
  • 名称空间
  • 虚拟环境
  • 视图层之必会三板斧
  • 视图层之jsonResponse对象
  • 视图层之request对象获取文件
  • 视图层之FBV与CBV
  • CBV源码剖析

今日内容详细

路由分发

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

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

使用路由分发之前 总路由直接跟路由与视图函数匹配
	path('index/', index)
使用路由分发之后 总路由只按照应用名分配匹配方向
	path('app01/', include('app01.urls'))

名称空间

路由分发之后 针对相同的别名能否反向解析出不同的应用前缀
	默认情况下是无法直接识别应用前缀的

如果想要正常识别区分有两种方式
	方式1:名称空间
		总路由
		path('app01/', include(('app01.urls', 'app01'), namespace='app01')),
		path('app02/', include(('app02.urls', 'app02'), namespace='app02')),
		反向解析
		reverse('app01:index_view')
		reverse('app02:index_view')

	方式2:别名不冲突即可
		多个应用别名不冲突 可以使用应用名作为别名的前缀
		path('index/', views.index_func, name='app01_index_func'),
		path('index/', views.index_func, name='app02_index_func'),

python虚拟环境

假设
	项目1需要使用:django1.11						python38
	项目2需要使用:django2.22 pymysql requests		python38
	项目3需要使用:django3.22 request_html flask	python38
	不同的项目需要不同的模块 并且在实际开发中我们只会给项目配备所需要的的环境 不需要的一概不配!!!即使不用 也会占用资源

虚拟环境:能够针对相同版本的解释器创建多个分身 每个分身都有自己独立的环境

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

命令行的方式创建: python -m venv 环境名

注意:命令行创建虚拟环境的时候不支持多版本共存的操作 也就是前面不能够指定pyton解释器版本 如python27 python36 python38
'''要指定解释器版本的话就修改一下环境变量 将对应版本的环境变量上移'''
创建完成后还需要切换到虚拟环境地址中的Scripts 并激活才能够使用
	激活
		activate
	关闭
		deactivate

视图层之必会三板斧

用来处理请求的视图函数都必须返回HttpResponse对象		这话完全正确
查看三板斧对应的源码发现
HttpResponse是一个类
class HttpResponse:
    pass
视图函数中
return HttpResponse() # 类名加括号 产生一个对象 返回一个HttpResponse对象

查看render源码
def render():
    return HttpResponse()   # 同理

查看redirect源码
def redirect():
    redirect_class = 类(该类的祖先类其中有HttpResponse)
    return redirect_class() # 祖先类有HttpResponse 所以说法也没错

JsonResponse对象

可以将数据通过json序列化后传到浏览器中

from django.http import JsonResponse
import json

通过之前学的json模块可以实现
def index_func(request):
    user_dict = {'name': 'jason老师', 'age': 18}
    user_json = json.dumps(user_dict, ensure_ascii=False)
    return HttpResponse(user_json)

通过JsonResponse实现
def index_func(request):
    user_dict = {'name': 'jason老师', 'age': 18}
    return JsonResponse(user_dict)

但是却无法将像json模块一样传ensure_ascii=False 需要查看源码扩展
class JsonResponse(HttpResponse):
    def __init__(self, data, encoder=DjangoJSONEncoder, safe=True,
                 json_dumps_params=None, **kwargs):
        data = json.dumps(data, cls=encoder, **json_dumps_params)
        
可以发现也是通过json.dumps实现 并且可以通过给json_dumps_params传值 让其中的dumps拥有ansure_ascii参数
JsonResponse(user_dict, json_dumps_params={'ensure_ascii': False})

JsonResponse主要序列化字典 针对非字典的其他可以被序列化的数据需要修改safe参数为False

user_list = ['jason', 'kevin', 'tony']
return JsonResponse(user_list, safe=False)

视图层之request对象获取文件

form表单携带文件类型的数据需要做到以下几点
	1.method必须是post
	2.enctype必须是multipart/form-data

django后端需要通过request.FILES获取文件类型的数据
	request.FILES			结果是一个字典
	request.FILES.get()		取其中一个文件对象
	request.FILES.getlist() 取所有文件对象
	取出的文件对象可以.name获得文件名
	

视图层之FBV与CBV

FBV
	基于函数的视图
	def index(request):
        return HttpResponse对象

CBV
	基于类的视图
	from django import views
	class MyView(views.View):
        def get(self, request):
            return HttpResponse('from CBV get function')
        
        def post(self, request):
            return HttpResponse('from CBV post function')

在路由层的写法也有所改变
path('myview/', views.MyView.as_view())
会自动根据请求方法的不同匹配对应的方法并执行

CBV源码剖析(重要)

1.从CBV的路由匹配切入
	path('myview/', views.MyView.as_view())
		1.类名点名字(名字的查找问题)
		2.类名点名字并加括号调用(静态方法 绑定给类的方法)
2.函数名加括号执行优先级最高 项目一启动就睡自动执行as_view方法
	最后路由层中相当于 
	path('myview/', views.view)  # CBV路由的本质还是FBV
3.浏览器地址栏访问myview路由需要执行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)

模板层

'''
模板语法
	{{}}:主要与数据值相关
	{%%}:主要与逻辑相关

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

1.针对需要加括号调用的名字 django模板语法会自动加括号调用 只需要写名字就行
2.模板语法的注释前端浏览器是无法查看的{##}
'''

1.模板语法传值
	方式1:精准传值 不浪费资源 针对多资源的传递书写较麻烦
	return render(request, 'demo.html', {'name': name, 'age': age})
	方式2:将函数名称空间中所有的名字全部传递 名字过多并且不使用的情况下比较浪费资源
	return render(request, 'demo2.html', locals())

2.模板语法传值特性
	1.基本数据类型正常展示
	2.文件对象也可以展示并调用方法
	3.函数名自动加括号执行并将返回值展示到页面上(不支持额外传参)
	4.类名也会自动加括号调用
	5.对象不会自动加括号
	ps:总结针对可以加括号调用的名字模板语法都会自动加括号调用

3.模板语法之过滤器(内置函数)
	length			返回值的长度
		{{ value|length }}
	filesizeformat	将值格式化为一个人类可读的文件尺寸
		{{ value|filesizeformat }}
	slice			切片
		{{ value|slice:"1:3" }}
	date			格式化时间
		{{ value|date:"Y-m-d H:i:s"}}
	save			告诉django这段代码是安全的
		value = "<a href='#'>点我</a>"
		{{ value|safe}}   # 不写safe这个标签不生效
posted @ 2022-12-13 20:41  LZJJJ  阅读(40)  评论(0)    收藏  举报