Django视图层
知识点一:Django2.0中path与re_path的应用
1.from django.urls import path,re_path
2.path不支持正则,精准匹配
3.re_path用法就像1.1中的url(但是可以指定)
urls路由的配置:
from django.urls import path,re_path from app01 import views urlpatterns = [ url(r'^admin/', admin.site.urls), #re-path支持正则(类似于url) re_path(r'^test01/', views.test01), #path 不支持正则,精准匹配,是什么,就匹配什么,跟它有一点不一样,就找不到 path(r'test02/', views.test02), #可以限定test03/路径后面写的,即转化器名字的类型 path(r'test03/<int:year>',views.test03), re_path(r'^$',views.index), #http://127.0.0.1:8000/ 只输这个的时候默认跳转到主页 re_path(r'', views.error), #如果没有匹配到就显示网页走丢提示 ]
views视图的设置:
from django.shortcuts import render,HttpResponse,redirect # Create your views here. def test01(request): return HttpResponse('这是test01界面') def test02(request): return HttpResponse('这是test02界面') #必须和路由里面定义的参数名字一样 def test03(request,year): print(year,type(year)) return HttpResponse('这是test03界面') def index(request): return HttpResponse('这是index主页') def error(request): return HttpResponse('地址错误,走丢了,亲!')
Django默认支持以下5个转化器:
- str,匹配除了路径分隔符(
/
)之外的非空字符串,这是默认的形式 - int,匹配正整数,包含0。
- slug,匹配字母、数字以及横杠、下划线组成的字符串。
- uuid,匹配格式化的uuid,如 075194d3-6885-417e-a8a8-6c931e272f00。
- path,匹配任何非空字符串,包含了路径分隔符(/)(不能用?)
自定义类型转换:
定义class类
#导入模块register_converter from django.urls import path,re_path,include,register_converter #定义类(名字都是固定写法) class Test: #正则限定url输入的位数格式 regex = '[0-9]{4}' #to_python:获取url输入的内容, def to_python(self, value): #value是<>里面输入的内容:即<int:year> # 下面可以对着数据再做一些其他的而处理 value=value+'aaa' # return int(value) #还可以对返回给到视图层的value值再做修改 return value #return的值会传给视图函数接收 #to_url用于反向解析 def to_url(self, value): return '%04d' % value #因为上面是要匹配4个数字,这里就是如果位数不够会自动补全0 register_converter(Test,'yyy') #(类型,以及重命名后的名字)
路由设置给类传参数:
urlpatterns = [ #<yyy上面重命名的名字:year和视图接收的名字一样> path(r'index/<yyy:year>', views.index), ]
视图层设置:
def index(request,year): print(year,type(year)) return HttpResponse('验证自定义转换类型')
验证效果如下:
知识点二:MVC和MTV
M T V
models emplate views
M V C(路由+views)
models 模板 控制器
MVC实质就是MTV,Diango框架就是MVC架构
知识点三:视图层
1.request是个对象:
2.form表单里面不定义method=‘’,默认是get请求
3.get与post的使用环境
get:请求数据,请求页面
post:向服务器提交数据
4.request.method 是个数据属性,打印的是请求的类型:例如POST、GET
5.request.GET 字典
6.request.POST 字典
7.http://127.0.0.1:8000 /index/ppp/dddd /?name=lqz
ip地址和端口 路径 参数(数据)
8.request.path 数据属性 打印的是url路径:/index/ppp/dddd
request.get_full_path() 打印的是路径+数据:/index/ppp/dddd/?name=lqz
9.Request.body :输出是post提交的内容,是bytes类型
知识点四:JsonResponse 向前端页面发json格式字符串
一般的操作情况借助json:
#正常情况将json格式输出到网页上显示 import json dic = {'name': 'yangzhizong', 'age': 18} aa=json.dumps(dic) #json.dumps : dict转成str print(aa,type(aa)) return HttpResponse(aa)
拿到的数据就放到页面显示的响应体里面
方式二:利用Django封装的一个模块 JsonResponse
#方法二:模块块JsonResponse #先导入模块 from django.http import JsonResponse def index(request): dic = {'name': 'yangzhizong', 'age': 18} # li=[1,2,3] return JsonResponse(dic) #只能反字典格式 # return JsonResponse(li) #无法反列表
如果要想将列表格式传入到页面上,将一下设置改为false即可:
知识点五:CBV基于类(class base view)和FBV基于函数(function base view)
演示CBA基于类的格式:
视图层:
1.先到导入模块 :
from django.views import View
2.url路由里面配置:
urlpatterns = [ url(r'^admin/', admin.site.urls), path(r'index/', views.index),#做对比说明 #下面就是CBV在视图里的写法(固定写法) #views.Test.as_view()执行完和上面一样也是个函数(即get对应函数 或者post对应的函数) #views.Test定位到视图函数那个类 as_views是类里面的一个方法,即括号才能执行 path(r'index/', views.Test.as_view()), ]
3.views视图里面如何相应设置
#演示CBV基于类如何使用 from django.views import View class Test(View): #如果是get请求就执行get方法 def get(self,request): obj=render(request,'index.html') print(type(obj)) #<class 'django.http.response.HttpResponse'> return obj #返回一个对象和FBA一样 #如果是post请求就执行get方法 def post(self,request): print(request.POST) return HttpResponse('ok')
实现效果如下:
dispath 派生和分发讲解:注意执行的流程顺序
class Test(View): def dispatch(self, request, *args, **kwargs): # 第一步:请求来了先走这一步 #加点东西,可以在运行get\post调用之前再加点别的东西 print('111') #第三步:传给dispatch #dispath分发和派生,相当于是个装饰器 obj=super().dispatch(request,*args,**kwargs) #这一步实在执行get或者post方法 #加点东西 print('2222') return obj #第四步还要回来将返回结果给到页面显示 #第二步:从这里拿数据 #如果是get请求就执行get方法 def get(self,request): obj=render(request,'index.html') print(type(obj)) #<class 'django.http.response.HttpResponse'> return obj #返回一个对象和FBA一样 #如果是post请求就执行get方法 def post(self,request): print(request.POST)