首页 > 编程语言 >进入python的世界_day51_Django之视图层、模板层

进入python的世界_day51_Django之视图层、模板层

时间:2022-12-13 21:57:09浏览次数:53  
标签:return python self request 视图 Django app01 def

一、路由分发

django中应用 都可以有自己独立的 urls.py文件 templates文件夹static文件夹
能够让基于django开发的多个应用完全独立 便于小组开发

能分能收

整个dj项目下的路由叫总路由,每个app的路由叫子路由

# 总路由
path('app01/',include('app01.urls')),
path('app02/',include('app02.urls')),


# 子路由
path('index/',views.after) #app01  
path('index/',views.after) #app02

二、名称空间

在路由分发场景下 多个应用在涉及到反向解析别名冲突的时候无法正常解析

# 解决方式一:
path('app01/',include(('app01.urls','app01'),namespace='app01'))
path('app01/',include(('app01.urls','app02'),namespace='app02'))

# 解决方式二:
!自己起别名时加上应用名字即可,反正就是自己看着来,不要冲突即可

三、虚拟环境

​ 因为以后工作中,有的项目需要这个版本的python,然后需要啥啥啥的模块,有的项目需要那个版本的python,有需要啥啥啥的模块,这样我们如果不使用虚拟环境得切来切去还要不时的删除多余模块(多余模块会占用资源),非常麻烦

一个解释器版本,有多个分身,每个分身有独立的模块空间

pycharm创建

​ 每创建一个虚拟环境,就相当于重新下载了一个全新的解释器,绿色框是让创的这个虚拟环境可以应用于其他项目

虚拟环境创建好后,终端也切成了虚拟环境的情景

我们点击pycharm的终端时,可能会报错,如下所示

解决方法:

​ 解决方法: win+x 以管理员方式运行powershell

​ 输入: set-executionpolicy remotesigned 接下来输入“y”表示执行,之后重新打开pycharm打开终端即可

命令行创建

# 代码
# 建议选择除了c盘以外的地方创建
python -m venv 要创建虚拟空间文件夹名字

# 创好后,要进入这个文件夹中的script文件夹激活下
cd script
activate  # 激活
deactivate # 取消激活
# 激活后,每一行的命令抬头前面都有带venv的提示

四、视图层

1.三板斧

​ 用来处理请求的视图函数都必须返回HttpResponse对象,该语句是完全正确

1.HttpResponse() #这是类加括号,产生了对象,肯定是没问题的,返回的就是对象
2.render()   # 查看源码,这个render也是返回HttpResponse产生的对象
3.redirect() # 查看源码,发现返回的本质还是继承了HttpResponsed的对象

2.返回json格式数据

# 1.最基本的返回
import json
def index_func(request):
    user_info = {'name': '小红', 'age': 18}
    user_json = json.dumps(user_info,ensure_ascii=False) # 这里改了是支持中文
    return HttpResponse(user_json)

# 2.利用django的JsonResponse模块
from django.http import JsonResponse # 可以导入 jsonRespons 直接可以 序列化字典
def index_func(request):
    user_info = {'name': '小明', 'age': 18}
    return JsonResponse(user_info,)
#不过发现,这种直接用模块的方法,还是不支持中文

# 3.通过查看JsonResponse的源码,发现可以改一下传参的值,变形后即可支持中文
def index_func(request):
    user_info = {'name': '小明', 'age': 18}
    return JsonResponse(user_info, json_dumps_params={'ensure_ascii': False})
# 序列化 非字典类型数据 还需要指定 safe参数 为False
l1 = [1, 2, 3, 4, 5, 6]
return JsonResponse(l1, json_dumps_params={'ensure_ascii': False}, safe=False)

3.request获取文件**

form表单携带文件类型数据必备的条件:

​ 1.form标签的属性得加上method="post" 并且,settings.py里面的MIDDLEWARE 中间的那行得注销

​ 2.form标签的属性得加上,enctype,属性值必须是multipart/form-data

request.FILEs获取

​ 能获取前端传过来的文件,是列表套对象的形式,不过列表内的数据是二进制流数据,还要拿出来

# 拿到文件对象
file_obj = request.FILES.get('file') # 如果有多个,就getlist
# 完善一下视图函数,拿到文件对象数据后,逐行读取并写入在当前目录下
def index_func(request):
    if request.method == 'POST':
        file_obj = request.FILES.get('file')
        with open(r'%s' % file_obj.name, 'wb') as f:
            for line in file_obj:
                f.write(line)
    return render(request, 'index_html.html')

五、FBV与CBV***!

1.FBV

​ 基于函数的视图

​ 这几天写的都是

2.CBV

​ 基于类的视图

#views
from django import views # 要导入模块先

class Myfunc(views.View): # 必须继承这个
    def get(self,request):
        return HttpResponse('CBV GET方式')
    def post(self,requset):
        return HttpResponse('CBV,POST方式')
    
#urls
path('func/',views.Myfunc.as_view()  # 必须.as_view()

  • CBV会自动根据请求方式的不同匹配类中定义的方法并自动执行

3.CBV源码分析(部分)

  1. 源码分析路径,分析为啥要加尾部的.as_view()

​ 一个类,点了一个方法并且带了括号,有两种情况,第一种是一个普普通通的函数被@staticmethod修饰,第二种是绑定给类的方法类来调把类名当参数传进去

​ 2.研究源码发现,CBV本质和FBV一样,调用路由时,即执行views.view

@classonlymethod		
def as_view(cls, **initkwargs):  
    ...
    def view(request, *args, **kwargs):
        self = cls(**initkwargs)  # cls是我们定义的类
        ...
        return self.dispatch(request, *args, **kwargs)
    		# 这个self就是我们自己类产生的对象,所以先从自身查起
    ...
    return view  #最后 发现 返回的是 view函数体

​ 3.研究dispatch方法

​ 首先我们自己views里写的类,现在阶段不能有dispatch方法,不然按照self.方法查找顺序,先从自身找起,如果自身有,就不找父类了

# http_method_names = ['get', 'post', 'put', 'patch', 'delete', 'head', 'options', 'trace'],目前我们就学了两个
def dispatch(self, request, *args, **kwargs):
    #  请求方式小写字符串  在不在 后面这个列表里面面
    if request.method.lower() in self.http_method_names:
        # 面向对象 反射 通过字符串请求方式 获取 对象内属性 赋值给变量
        # 刚好,我们自己写的类,有get
        handler = getattr(self, request.method.lower(), self.http_method_not_allowed)
    else:
        handler = self.http_method_not_allowed
        #最后 直接执行该方法 即执行 我们写的类下的方法
        return handler(request, *args, **kwargs)

六、模板层

1.传值语法

  • 指名道姓的传,用字典一个一个的传,精准的传

    return render(request,'test.html',{'xx':xxx,'xxxx':xxxxx})
    
  • 该视图函数中所有名称,被传的html都可以直接{{}}使用

    关键字——locals()

    return render(request,'test.html',locals())
    

2.传值特性

​ 主要研究传值的一些特点

django 模板语法中符号 就两个
​ 需要使用数据的时候{{}}
​ 需要使用方法的时候{% %}

# 1.八大python数据类型都可以正常传
# 2.函数,函数名的传递会自动加括号执行 并将返回值展示到页面上
    # 注意函数如果有参数则不会执行也不会展示 django模板语法不支持有参函数
# 3.类名传递也会被加括号调用,产生的对象被展示到了html页面上,并且对象也可以调用方法

# 总结:
	# 模板语法会判断每个名字是否可调用 如果可以则调用

3.过滤器

​ 有点类似于python的内置函数,调用是通过' | :' 或' | '来调用

<p>同级长度:{{ s|length }}</p>   
<p>数字加法运算:{{ i|add:6 }}</p>     # 源码中运用了异常捕获,所以可以加整形又拼接字符串
<p>字符串拼接:{{ s|add:'world' }}</p>  
<p>日期转换:{{ res|date:'Y年-m月-d日 H:i:s' }}</p> # X不识别,用不了
<p>文件大小:{{ file_size|filesizeformat }}</p>  # 会自己斟酌哪个单位更合适
<p>数据切片:{{ l|slice:'1:3' }}</p>   
<p>字符截取:(按字符个数截取 三个点 算一个){{ s|truncatechars:3 }}</p>   #超出范围 会返回完整的数据 
<p>单词截取:(三个点不算 按空格计算单词截取){{ s|truncatewords:3 }}</p>
<p>语法转义:{{ 标签名|safe }}</p>   # 重点,意思是让html放手去做

今日单词
serialized 序列化

标签:return,python,self,request,视图,Django,app01,def
From: https://www.cnblogs.com/wznn125ml/p/16980743.html

相关文章