Django微讲解(四)

Django微讲解(四)

虚拟环境

	在实际开发项目工作中,针对不同的项目需要为其配备对应的解释器环境,为了无障碍的打开并运行,我们有两种办法,方式一:把
所有需要用到的模块全部下载下来,如果有相同模块不同版本每次都重新下载替换;很明显方式一是不可取的,所以还有第二种方式:提前准
备好多个解释器环境,针对不同的项目进行切换即可,很明显第二种方式更合理,所以我们就要用到虚拟环境。
# 1.创建虚拟环境
	点击File-->New Project-->Pure Python-->New environment using-->Create即可创建一个虚拟环境
# 2.识别虚拟环境
	目录下有一个红色的venv文件夹
# 3.如何切换环境
	我们先在创建好的虚拟环境下载好我们先要模块或者框架,然后就可以创建新的pycharm窗口,选择不同的解释器即可。

创建虚拟环境

切换环境

Django版本区别

	Django的版本区别主要在于1.x与2.x、3.x之间的区别,因为2.x与3.x基本没有大的区别,我们讲一下1.x与另外两个版本在路由
层的区别。
# 1.路由匹配的方法不一样
	(1)1.x使用的是url方法,第一个参数支持正则
    (2)另外两个版本使用的是path方法,第一个参数不支持正则,如果想要使用正则,也提供了一个re_path方法,只需要导入该模块
即可
# 2.path方法提供了转换器功能
	匹配对应位置的数据并且会自动转换类型,一共有五中转换器,分别是:
	str:匹配除了路径分隔符(/)之外的非空字符串,这是默认的形式
	int:匹配正整数,包括0
	slug:匹配字母、数字、下划线以及横杠组成的字符串
	uuid:匹配格式化的uuid
	path:匹配任何非空字符串,包含了路径分隔符,不能用'?'
'''
例子:path('admin/<int:id>',views.index)
'''

视图函数返回值

# 视图函数必须返回一个HttpResonse对象
	我们前面讲过的Django小白必会三板斧HttpResonse、render、redirect其实其实最后返回的都是HttpResonse对象
# 1.HttpResonse
	class HttpResonse(...):
        pass
# 2.render
	def render(...):
        return HttpResonse(...)
# 3.redirect
	def redirect(...):
        # 多继承

JsonResponse对象

from django.http import JsonResponse
def test(request):
    user_dict = {'name': 'oscar','password': 123,'hobby': '与世无争'}
    return JsonResponse(user_dict,json_dumps_params={'ensure_ascii': False})
'''
通过查看源码来学习,有已知推导未知
Django对json序列化的数据类型的范围做了扩充,所以我们使用JsonResponse而不是原始的json模块
'''

form表单上传文件

	form表单上传的数据中如果含有文件,那么需要做一下几件事:
        1.method必须是post
        2.enctype必须修改为multipart/form-data,默认不修改的是application/x-www-form-urlencoded
        3.后端需要使用request.FILES获取
# 示例
    print(request.FILES)  # 专门获取文件数据
    file_obj = request.FILES.get('my_file')
    print(file_obj.name)  # 查看文件名
    with open(file_obj.name,'wb') as f:
        for line in file_obj:  # 支持for循环
        f.write(line)

request其他方法

# 1.request.body
	存放的是接收过来的最原始的二进制数据,request.POST、request.GET、request.FILES这些获取数据的方法其实都是从body
中获取数据并解析存放的
# 2.request.path、request.path_info
	获取路径
# 3.request.get_full_path()
	获取路径并且还可以获取到路径后面携带的参数

FBV与CBV

# 1.FBV:基于函数的视图
	url(r'^index/',函数名)
# 2.CBV:基于类的视图
	from django import views
    class MyViews(views.View):
        def get(self,request):
            return HttpResponse('来着CBV的get方法')
        def post(self,request):
            return HttpResponse('来自CBV的post方法')
	url(r'^CBV/', views.MyViews.as_view())
'''
如果请求方法是GET,会自动执行类里面的get方法
如果请求方式是POST,会自动执行类里面的post方法
'''

CBV源码剖析

# 1.切入点:路由匹配
	因为我们使用类名加点调用属性as_view并且还加了括号,所以我们初步判断as_view可能是普通的静态方法,或者是绑定给类
的方法。我们通过'ctrl+鼠标左键'点击查看源码发现,as_view是绑定给类的方法。
# 2.对象查找属性的顺序
	先从对象自身开始、再从产生对象的类、之后时候该类继承的各个父类
    url(r'^CBV/', views.MyViews.as_view())以这个为例子,我们使用类名加点调用了属性as_view,我们现在我们自己定义的类
中查找,发现并没有这个属性或者说方法,所以我们就去继承的父类中查看,发现这是一个绑定给类的方法。
# 3.函数名加括号执行优先级最高
	url(r'^CBV/', views.MyViews.as_view()),我们来看as_view加括号调用了,所以项目一启动就会执行as_view方法,查
看源码得知这个绑定给类的方法返回了一个闭包函数名view
    def as_view(cls):
        def view(cls):
            pass
        return view
    所以上述例子我们可以这样认为:url(r'^CBV/', views.view),所以CBV与FBV在路由匹配上本质是一样的。
# 4.路由匹配成功之后执行view函数
	def view(request, *args, **kwargs):
        self = cls(**initkwargs)  # cls是我们自己写的类
        if hasattr(self, 'get') and not hasattr(self, 'head'):
        	self.head = self.get
        self.request = request
        self.args = args
        self.kwargs = kwargs
        return self.dispatch(request, *args, **kwargs)
# 5.执行dispatch方法
	执行view函数返回了dispatch方法,对象加点调用了这个方法,我们先在产生对象的类中查找,发现没有没有方法,然后就去
继承的父类中查找
	def dispatch(self, request, *args, **kwargs):
        if request.method.lower() in self.http_method_names:  # 判断当前请求方式是否在http_method_names中
            handler = getattr(self, request.method.lower(), self.http_method_not_allowed)  # 利用反射通过字符串
来操作对象的属性或者方法,里面的参数分别为:自己写的类产生的对象,请求数据的方法,当找不到请求数据方法的时候会用的参数
        else:
            handler = self.http_method_not_allowed
        return handler(request, *args, **kwargs)
    http_method_names = ['get', 'post', 'put', 'patch', 'delete', 'head', 'options', 'trace']  # 请求数据的八种
方法

模板语法传值

# 1.Django提供的模板语法只有两个符号
	{{}}: 主要用于变量相关操作
	{%%}: 主要用于逻辑相关操作(循环、判断)
# 2.传值的两种方式
	1.指名道姓的传,适用于数据量较少的情况,节省资源
    示例:return render(request,'index.html',{'name': 'oscar'})
    2.打包传值,适用于数据量较多的情况,有时候会浪费资源,有一个方法'locals()',会将当前名称空间中所有的名字全部传递
给HTML页面
    示例:return render(request,'index.html',locals())
# 3.传值的范围
	1.基本数据类型都可以
    2.函数名,模板语法会自动加括号执行并将函数的返回值展示到页面上,不支持传参,模板语法会自动忽略有参函数
    3.文件名,直接显示文件IO对象
    4.类名,自动加括号实例化成对象
    5.对象名,直接显示对象的地址,并且具备调用属性和方法的能力
# 4.Django模板语法针对容器类型取值
	使用'句点符',既可以点key,也可以点索引

这里是IT小白陆禄绯,欢迎各位大佬的指点!!!

posted @ 2022-05-15 17:17  陆禄绯  阅读(38)  评论(0编辑  收藏  举报