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小白陆禄绯,欢迎各位大佬的指点!!!
标签:self,request,Django,CBV,讲解,方法,def,view 来源: https://www.cnblogs.com/pyqsy/p/16273738.html