zoukankan      html  css  js  c++  java
  • Django视图层

    知识点一:Django2.0中pathre_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):
            # 第一步:请求来了先走这一步
            #加点东西,可以在运行getpost调用之前再加点别的东西
            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)

  • 相关阅读:
    Linux filesystem
    centos 下 gradle 编译打包 apk
    python SSL 错误
    nginx 缓存配置
    nginx 反向代理配置
    redhat 网卡绑定
    磁盘阵列
    Centos 安装Django2.1
    python pyquery 基本用法
    python 爬虫之-- 正则表达式
  • 原文地址:https://www.cnblogs.com/yangzhizong/p/9594201.html
Copyright © 2011-2022 走看看