路由分发、名称空间、视图层之必会的三板斧、JsonResponse对象、request获取文件、FBV与CBV、模板层语法传值

一、昨日内容回顾

二、路由分发

1.djiango的每个应用都有主见的templates文件夹,djiango文件夹,static文件夹等有利于分组
2.路由分发有益于防止总路由urls.py的代码冗余
3.组长可以将组员写的APP全部拷到一个新的djiango项目中,利用路由分发的特点整合app

总路由:
from django.contrib import admin
from django.urls import path,include urlpatterns = [
path('admin/', admin.site.urls),
path('app01/',include('app01.urls')),
path('app02/',include('app02.urls'))
]
app01
urls.py:
from django.urls import path
from app01 import views
urlpatterns = [
path('index/', views.index_urls),
]
views.py:
from django.shortcuts import render,HttpResponse # Create your views here.
def index_urls(request):
return HttpResponse('from app01 index urls')
app02
urls.py:
from django.urls import path
from app02 import views
urlpatterns = [
path('index/', views.index_urls),
]
views:
from django.shortcuts import render,HttpResponse # Create your views here.
def index_urls(request):
return HttpResponse('from app02 index urls')

三、名称空间

当多个应用出现了相同的别名时,无法识别应用的前缀

解决方式一:名称空间

总的路由添加一个名称空间:
path('app01/',include(('app01.urls','app01'),namespace='app01')),
path('app02/',include(('app02.urls','app02'),namespace='app02'))
urls:
urlpatterns = [
path('index/', views.index_urls, name='index_urls'),
]
views:
def index_urls(request):
print(reverse('app01:index_urls'))
return HttpResponse('from app01 index urls')

解决方式二:起别名

总路由:
path('app01/',include('app01.urls')),
path('app02/',include('app02.urls'))
子路由:
urls:
urlpatterns = [
path('index/', views.index_urls, name='app01_index_urls'),
]
views:
def index_urls(request):
print(reverse('app01_index_urls'))
return HttpResponse('from app01 index urls')
1.只要名字不冲突,就没有必要使用名称空间
2.起别名我们一般在APP多的情况下,然后起别名的时候加上app当做前缀,这样就可以避免名字冲突的问题。

四、虚拟环境

虚拟环境的作用:
开发工作中针对不同的项目需要为其配备对应的解释器环境
诸多项目在你的机器上任何无障碍的打开并运行
#方式1:
把所用的模块都下载下来,如果有相同模块不同版本每次都重新下载替换
#方式2:
提前准备好多个解释器环境,针对不同的项目切换

有一个新的文件夹创建讲师表示虚拟环境创建成功

命令行创建虚拟环境的方式:
python -m venv xxxxxx
激活虚拟环境:
activate
关闭虚拟环境:
deactivate

五、视图层之必会三板斧

views.py文件里面是一系列的函数或者类
用来处理请求的视图函数都必须返回HttpResponse对象
1.HttpResponse
返回的是字符串类型
HttpResponse()括号内直接跟一个具体的字符串作为响应体
2.render
返回html页面,并且在返回给浏览器之前还可以给HTML文件传值
除了request参数外,还接受一个待渲染的模板文件和一个保存具体数据的字典参数
def render(request, template_name, context=None, content_type=None, status=None, using=None)
eg:def render(request,"index.html",{'form':form})
3. redirect
接受一个url参数,表示跳转到指定的url
eg: def redirect("/home")
研究底层源码
1.def index_func(request):
return HttpResponse()
"""
按住ctrl键点击进入HttpResponse,进去之后发现HttpResponse其实是一个类
类名加()就是实例化一个对象
class HttpResponse(HttpResponseBase):
def __init__(self,content,*args,**kwargs)
pass
"""
2.def index(request):
return render()
"""
按住ctrl键点击进入render:
def render(request, template_name, context=None, content_type=None, status=None, using=None):
content = loader.render_to_string(template_name, context, request, using=using)
return HttpResponse(content, content_type, status)
执行的是render函数,然后render函数返回的是HttpResponse(content, content_type, status)
"""
3.def index(request):
return redirect()
"""
按住ctrl键点击进入redirect:
def redirect(to, *args, permanent=False, **kwargs):
redirect_class = HttpResponsePermanentRedirect if permanent else HttpResponseRedirect
return redirect_class(resolve_url(to, *args, **kwargs)) 按住ctrl键点击进入HttpResponsePermanentRedirect:
class HttpResponsePermanentRedirect(HttpResponseRedirectBase):
status_code = 301
........ 最后发现它继承的也是HttpResponse
"""
综上:Django视图层函数必须要返回一个HttpResponse对象

六、JsonResponse对象

def index(request):
user_dict = {'name':'jia老师','age':18}
import json
user_json = json.dumps(user_dict,ensure_ascii=False) #
return HttpResponse(user_json)
from django.http import JsonResponse
def index(request):
# user_dict = {'name':'jia老师','age':18}
# import json
# user_json = json.dumps(user_dict,ensure_ascii=False)
# return HttpResponse(user_json)
l1 = [11,22,33,44,55,66]
return JsonResponse(l1,json_dumps_params={'ensure_ascii':False},safe=False) 查看源码发现扩展的功能
class JsonResponse():
def __init__(self,data,json_dumps_params=None):
json.dumps(data,**json_dumps_params)
JsonResponse主要序列化字典 针对非字典的其他可以被序列化的数据需要修改safe参数为False

七、视图层之request对象获取文件

html代码:
<h1>获取数据</h1>
<form action="" method="post" enctype="multipart/form-data">
<p>
username:
<input type="text" name="username">
</p>
<p>
hobby:
<input type="checkbox" name="hobby" value="basketball">篮球
<input type="checkbox" name="hobby" value="basketball1">篮球1
<input type="checkbox" name="hobby" value="basketball2">篮球2
</p>
<p>
file:
<input type="file" name="file">
</p>
<input type="submit" value="按钮">
<button>按钮</button>
</form>
    if request.method == 'Post':
print(request.POST)
print(request.FILES)
return render(request,'1.html')

    if request.method == 'POST':
# print(request.POST)
# print(request.FILES) file_obj = request.FILES.get('file')
print(file_obj.name)
with open(r'%s' % file_obj.name, 'wb') as f:
for line in file_obj:
f.write(line)
return render(request,'1.html')

八、FBV与CBV

FBV(Function base view):基于函数的视图 我们之前写过的都是FBV
CBV(Class base view)
1.FBV
def index(request):
return HttpResponse对象
2.CBV
from django import views
class MyLoginView(views.View):
def get(self, request):
return HttpResponse('from CBV get function') def post(self, request):
return HttpResponse('from CBV post function')
path('login/', views.MyLoginView.as_view())

九、CBV源码剖析

path('login/', views.MyLoginView.as_view())
"""
面向对象属性方法的查找顺序:
1.先从对象自己的名称空间找
2.去产生类对象的类里面找
3.去父类里面找
"""
源码分析入口
path('func/', views.MyView.as_view())
1.绑定给类的as_view方法(它是我们自己写的类里面继承的类)
class View:
@classonlymethod
def as_view(...):
绑定给类的,类调用会自动将类当作第一个参数传入
def view(...):
pass
return view
2.CBV路由匹配本质:跟FBV是一致的
path('func/', views.view)
3.访问func触发view执行
def view(...):
obj = cls() # 我们自己写的类加括号产生的对象
return obj.dispatch()
'''涉及到对象点名字 一定要确定对象是谁 再确定查找顺序'''
4.研究dispatch方法
def dispatch(...):
判断 request.method将当前请求方式转成小写 在不在 self内 self==MyLogin
"http_method_names 内有八个请求方式 合法"
['get', 'post', 'put', 'patch', 'delete', 'head', 'options', 'trace']
if request.method.lower() in self.http_method_names:
# getattr 反射: 通过字符串来操作对象的属性或者方法
func_name = getattr(obj,request.method.lower())
else:
handler = self.http_method_not_allowed
return handler(request, *args, **kwargs)
用到了一个反射的知识,从obj这个对象里面,找一个request.method.lower()这个的函数

十、模板层

1.模板语法的传值

urls代码:
path('modal/', views.modal) views代码:
def modal(request):
name = 'jason'
return render(request, 'modal.html', {'name':name}) 指名道姓传参 不浪费资源
html代码:
<body>
{{ name }}
{{ age }}
{{ gender }}
</body> urls代码:
path('modal/', views.modal) views代码:
def modal(request):
name = 'jason'
age = 18
gender = 'female'
return render(request, 'modal.html', locals()) # 将函数体里局部空间里所有的名字全部传入给前面的那个页面 将整个局部名称空间中的名字去全部传入简单快捷

2.模板语法传值特性

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

路由分发、名称空间、视图层之必会的三板斧、JsonResponse对象、request获取文件、FBV与CBV、模板层语法传值的更多相关文章

  1. Django框架路由分发-名称空间

    目录 一:路由分发 1.路由分发简介 2.总路由分发配置 3.总路由终极配置(不需要导应用路由,直接点应用即可) 4.子路由配置 二:名称空间 1.名称空间应用场景 3.解决方式二>>&g ...

  2. Django url反向解析与路由分发名称空间

    url反向解析 url.py from django.conf.urls import url from django.contrib import admin from app01 import v ...

  3. Web框架之Django_03 路由层了解(路有层 无名分组、有名分组、反向解析、路由分发 视图层 JsonResponse,FBV、CBV、文件上传)

    摘要: 路由层 无名分组 有名分组 反向解析 路由分发 名称空间 伪静态网页.虚拟环境 视图层 JsonResponse FBV 与 CBV(function base views与class bas ...

  4. [Django框架之路由层匹配、有名 无名分组、反向解析、路由分发、名称空间、伪静态、本地虚拟环境、django版本区别]

    [Django框架之路由层匹配.有名 无名分组.反向解析.路由分发.名称空间.伪静态.本地虚拟环境.django版本区别] 路由层 路由即请求地址与视图函数的映射关系,如果把网站比喻成一本书,那路由就 ...

  5. django路由匹配、反向解析、无名有名反向解析、路由分发、名称空间

    目录 django请求生命周期流程图 1.Django请求的生命周期的含义 2.Django请求的生命周期图解及流程 3.Django的请求生命周期(分布解析) 路由层 1.路由匹配 2.path转换 ...

  6. Django 视图层和模板层

    目录 一.网站首页和404页面的路由配置 1. 网站首页路由 2. 404页面 二.Django视图层 1. 小白必会三板斧 (1)HttpResponse (2)render (3)redirect ...

  7. django之路由分组,路由分发,FBV,CBV,ORM框架

    今日的内容: a. 路由系统 1. 创建app 2. 路由的分组 3. 路由的分发 - 正则表达式匹配 b. django的orm(模型model) 1. 创建模型的步骤 2. orm基本的增删改查 ...

  8. Python 的名称空间和作用域

    最开始对名称空间的了解是在学习函数的时候,那时候知道了作用域的查找顺序,以及全局名称空间和局部名称空间,产生疑惑的时候为学递归的时候,那时候还没有名称空间这个概念,只知道递归有个最大深度,那时候以后递 ...

  9. Django之路由分发反向解析

    Django路由分发|反向解析 当一个Django中有多个app时,路由会有很多,将这些路由都写在与项目同名的文件夹下就会显得很多,很乱.并且在协同开发的时候容易出现相同的命名,当项目合并后就会出现路 ...

  10. Django基础之视图(views)层、模板层

    目录 Django基础之视图(views)层.模板层 JsonResponse 向前端返回一个json格式字符串的两种方式 重写Django中的json的某个方法 form表单上传文件 FBV与CBV ...

随机推荐

  1. python 爬虫 TCL SSL 安全证书问题

    其实很复杂 但也很简单 只需要在requests爬虫编写前 加上这句话 requests.packages.urllib3.util.ssl_.DEFAULT_CIPHERS = 'DH+AES:RS ...

  2. Python基础部分:10、数据类型的内置方法和字符编码

    目录 一.数据类型内置方法 1.字典dict内置方法 1.1.类型转换 2.字典必须要掌握的方法 2.1.取值方式 2.2.修改内部数据值 2.3.删除数据 2.4.统计字典中键值对个数 2.5.字典 ...

  3. .Net Core 3.0 对 MongoDB 的多条件(两种)查询操作

    前言   在日常开发中,偶尔会用到 MongoDB 的数据操作,也花费了一些时间调试,因此在此处记录一下,共同进步. 废话少说,出招吧! 正文 2.1 准备工作 首先需要引入 .Net 平台链接 Mo ...

  4. Spring Boot 中使用 Swagger

    前后端分离开发,后端需要编写接⼝说明⽂档,会耗费⽐较多的时间. swagger 是⼀个⽤于⽣成服务器接⼝的规范性⽂档,并且能够对接⼝进⾏测试的⼯具. 作用 ⽣成接⼝说明⽂档 对接⼝进⾏测试 使用步骤 ...

  5. ES的java端API操作

    首先简单介绍下写这篇博文的背景,最近负责的一个聚合型的新项目要大量使用ES的检索功能,之前对es的了解还只是纯理论最多加个基于postman的索引创建操作,所以这次我得了解在java端如何编码实现:网 ...

  6. 2022-11-08 Acwing每日一题

    本系列所有题目均为Acwing课的内容,发表博客既是为了学习总结,加深自己的印象,同时也是为了以后回过头来看时,不会感叹虚度光阴罢了,因此如果出现错误,欢迎大家能够指出错误,我会认真改正的.同时也希望 ...

  7. 【云原生 · Kubernetes】apiserver高可用

    个人名片: 因为云计算成为了监控工程师‍ 个人博客:念舒_C.ying CSDN主页️:念舒_C.ying 7.1 高可用选型 ipvs+keepalived nginx+keepalived hap ...

  8. C#winfrom调整任意控件宽和高

    在winform项目开发中,偶尔需要用到边框拖拽.度娘也没找到相关的轮子(可能是我不配,没推给我).只能自己造一个 上效果图(鼠标没录制上,问题不大) 上代码 private void Form1_L ...

  9. vscode,java中文乱码

    1.vscode默认是utf-8,但最好再打开自动检测 2.在vscode设置里搜 auto guess,启用auto guess encoding 3.windows默认的是gbk,在windows ...

  10. springboot +mybatis (@autowried 注入mapper :爆红)

    问题描述:Could not autowire. No beans of XXXXmapper' type found 问题相关页面: 解决方式一:@mapper  接口计入@Repository 解 ...