路由分发、名称空间、视图层之必会的三板斧、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. Oracle性能优化之运行参数设置

    Oracle参数调整建议值 sessions=2150 processes=2000 open_cursors=5120 db_file_multiblock_read_count=64 log_bu ...

  2. 嵌入式-C语言基础:指针偏移打印数组

    在C语言中,数组名代表数组中首元素的地址,所以,下面两句获取数组的首地址是等价的: #include<stdio.h> int main() { int a[5]={1,2,3,4,5}; ...

  3. C++初阶(vector容器+模拟实现)

    迭代器 四种迭代器 容器类名::iterator 迭代器名;//正向迭代器 容器类名::const_iterator 迭代器名;//常量正向迭代器,const修饰,只能用于读取容器内的元素,不能改变其 ...

  4. 1、Docker最新入门教程-Docker概述

    1. Docker概述 Docker 是一个用于开发.运输和运行应用程序的开放平台.Docker 使您能够将应用程序与基础架构分开,以便您可以快速交付软件.使用 Docker,您可以像管理应用程序一样 ...

  5. i春秋Zone

    打开网页是个简单的表单填写, 尝试注入....没用 查看源码,没找到什么有用的信息 只有抓包了 发现一个cookie的login值为0,改为1试试 没什么特别的回显,但这应该就是登录与否的判定了,所以 ...

  6. Linux配置篇 - Vmware网络配置

    网络配置 VM 网络详解 vmware提供了三种网络工作模式,Bridged(桥接模式).NAT(网络地址转换模式).Host-Only(仅主机模式): vmware网络配置步骤:编辑 -> 虚 ...

  7. 8 STL-stack

    ​ 重新系统学习c++语言,并将学习过程中的知识在这里抄录.总结.沉淀.同时希望对刷到的朋友有所帮助,一起加油哦!  生命就像一朵花,要拼尽全力绽放!死磕自个儿,身心愉悦! 写在前面,本篇章主要介绍S ...

  8. BFS和DFS学习笔记

    1 算法介绍 1.1 BFS Breadth First Search(广度优先搜索),将相邻的节点一层层查找,找到最多的 以上图为例,首先确定一个根节点,然后依次在剩下的节点中找已找出的节点的相邻节 ...

  9. windows 搭建iis文件服务器

    1.运行打开控制面板->程序->启用或关闭Windows功能,勾选下面所有的选项. 注意,必须安装功能所需文件. 等待 关闭即可. 2.在控制面板找到管理工具,不同版本的Windows不尽 ...

  10. Qwt开发笔记(一):Qwt简介、下载以及基础demo工程模板

    前言   QWT开发笔记系列整理集合,这是目前使用最为广泛的Qt图表类(Qt的QWidget代码方向只有QtCharts,Qwt,QCustomPlot),使用多年,系统性的整理,本系列旨在系统解说并 ...