• Django2.0路由补充之path,re_path及视图层


    以下是Django2.0版本

    正则捕获到的参数都是字符串,所以如果函数需要用的其他数据类型,可以在函数中直接转换,也可以在路由中直接转换,如下:

    下面实例是匹配整数,传过去的参数就是整数

    from django.urls import path,re_path

    path('admin/<int:year>,view.year.archive') ===>匹配到一个整数变量

    Django默认支持以下5个转化器:

    • str,匹配除了路径分隔符(/)之外的非空字符串,这是默认的形式
    • int,匹配正整数,包含0。
    • slug,匹配字母、数字以及横杠、下划线组成的字符串。
    • uuid,匹配格式化的uuid,如 075194d3-6885-417e-a8a8-6c931e272f00。
    • path,匹配任何非空字符串,包含了路径分隔符(/)(不能用问号,因为问号在url地址有特殊含义。)

    1.path

    path的第一个参数不能用正则

    path其实就是封装了五种精准的正则匹配(五个转换器),我们也可以自己定义方法。===》(int,str,slug,path,uuid)

    自定义转换器:

    • regex 类属性,字符串类型
    • to_python(self, value) 方法,value是由类属性 regex 所匹配到的字符串,返回具体的Python变量值,以供Django传递到对应的视图函数中。
    • to_url(self, value) 方法,和 to_python 相反,value是一个具体的Python变量值,返回其字符串,通常用于url反向引用。

    1 写一个类:
    class Test:
      regex = '[0-9]{4}'
      def to_python(self, value):
      # 中间写一堆处理
        value=value+'aaa'
        return value
      def to_url(self, value):  # 反向解析时候用到
        return '%04d' % value

    # 和path,re_path在一个模块里
    2 from django.urls import register_converter

    # 括号里跟两个参数,第一个自定义的类 第二个是自定义的转换器类型

    register_converter 将其注册到URL配置中
    3 register_converter(Test,'ttt')
    4 path('index/<ttt:year>', views.index,name='index'),

    2.re_path

    和Django1.1版本中的url用法相同,url地址可以用正则。

    re_path (r'^admin/(?P<name>w{3})$',views.admin)

    二 MVC和MTV

    MVC :M 模型     V  模板         C 控制器(路由+views)

    MTV:M 模型      T  template V  views

    三 视图层

    form表单,不写method 默认GET请求

    1 什么情况用GET :请求数据,请求页面

    1.什么情况用POST:向服务器提交数据,用GET会泄露数据,不懂技术的人也能看到

    request.GET  得到的是一个封装的字典:QueryDict

    request.POST  得到的是一个封装的字典:QueryDict

    获得请求的方式(类型):request.method

     http://127.0.0.1:8000/index/ppp/dddd/?name=lqz
     协议:ip地址和端口/路径?参数(数据)

     print(request.path)   获得的是不包括数据的请求
     print(request.get_full_path())  获得的是整个url 包括数据请求

    三件套:HttpResponse、redirect、render

    from django.shortcuts import 三件套

    JsonResponse(向前端页面发送json格式字符串)

    # dic={'name':'lqz','age':18}
    # li=[1,2,3,4]
    # # return HttpResponse(json.dumps(li))
    # from django.http import JsonResponse

    # 加safe是因为jsonResponse有安全保护不能直接向前端发送json格式字符串,所以要设置成False
    # return JsonResponse(li,safe=False)

    四 CBV(class base view)和FBV(function base view)

    CBV 和FBV基于类的视图和基于函数的视图

    CBV:

    1 from django.views import View
    2 class Test(View):
      def dispatch(self, request, *args, **kwargs):
      # 加点东西
        print('111')

        obj=super().dispatch(request, *args, **kwargs)
      # 加点东西
        print('2222')
        return obj
      def get(self,request):
        obj= render(request,'index.html')
        print(type(obj))
        return obj
      def post(self,request):
        return HttpResponse('ok')


    3 re_path(r'index/', views.Test.as_view()), # 这儿是固定写法

    简单文件上传

    index.html
    1 <form action="" method="post" enctype="multipart/form-data">
    用户名:<input type="text" name="name">
    密码:<input type="text" name="password">
    文件:<input type="file" name="myfile">
    <input type="submit">

    </form>
    #enctype="multipart/form-data"*******************  这个是上传文件必须要加的
    #<input type="file" name="myfile">  # 如果写了这个enctype但是没有上传文件,打印的request.FILES.get()会有浏览器配置等内容。

    2 # ff是一个文件对象,django封装的
    ff=request.FILES.get('myfile')
    # 文件对象的名字
    file_name=ff.name # 上传的文件名字。
    from django.core.files.uploadedfile import InMemoryUploadedFile  # 导入这个类 chunks是这个类的方法
    print(type(ff))
    with open(file_name,'wb') as f:  # chunks是一个生成器,通过yield不断把值给读出来。
      for line in ff.chunks():  # chunks是文件对象的方法,相当于断点续传。为什么不能直接in ff:直接写入:因为ff是一个对象,不是一个文件
        f.write(line)

  • 相关阅读:
    git-将dev代码合并到test
    java中一句话取到用split()截后的最后一个值
    shiro重定向或会话失效后NginxURL地址无效,以及浏览器控制台Mixed Content: The page at ‘https://XXX’ was loaded over HTTPS, but requested an insecure错误
    Linux 查找Nginx配置文件位置命令
    Linux 常用命令(个人暂时用到的)
    代理模式
    【Vue自学笔记(四)】天气案例
    【Vue自学笔记(三)】网络请求的简单使用
    【Vue自学笔记】案例
    【Vue自学笔记(二)】Vue指令
  • 原文地址:https://www.cnblogs.com/Roc-Atlantis/p/9591188.html
Copyright © 2020-2023  润新知