• day50:django:有名/无名分组&FBV/CBV


    目录

    1.URL有名分组和无名分组

    2.FBV和CBV

    URL有名分组和无名分组

    有名分组

    使用简单的正则表达式分组匹配(通过圆括号)来捕获URL中的值并以位置参数形式传递给视图

    urls.py

    from app01 import views
    url('^book/(?P<year>d)/(?P<month>d+)', views.book)

    views.py

    有名分组为关键字传参,与参数位置无关

    '''request下的一些属性和方法'''
    def book(request, month,year): # 参数位置随意
        request.GET # 包含所有HTTP GET参数的类字典对象  <QueryDict: {}>
        request.POST # 包含所有HTTP POST参数的类字典对象  <QueryDict: {}>
        request.method # 请求中使用的HTTP方法的字符串表示 全大写表示 GET
        request.path # 返回用户访问url 不包括域名  /book/2020/12
        request.path_info # 返回用户访问url 不包括域名  /book/2020/12
        request.get_full_path()  # /book/2020/12
        request.body #  请求体,byte类型 request.POST的数据就是从body里面提取到的  b''
        
        
    '''在view中定义的视图函数,可以返回如下几种'''
        return HttpResponse('xxx') # 一般后面加字符串
        return render(request, 'book.html',{'title':'xx'}) # title这个名字随便起的,html文件会使用这个名字
        return redirect('/index/') # 重定向 后面接路径
    
    '''可以修改HttpResponse对象相关的参数'''
        ret = HttpResponse('xxx') # 这是一个HTTPResponse对象
        ret['xx'] = 'oo' # 给对象加一个响应头键值对
        ret.status_code = 201 # 设置一个状态码 
        return ret

    request.get_full_path()和request.path区别

        比如发送一个请求的路径为127.0.0.1:8080/class_list/?name = 10

      request.get_full_path返回的是=>/class_list/?name=10

      request.path获取的是不带参数的路径=>/class_list/

    无名分组

    可以使用分组命名匹配的正则表达式组来捕获URL中的值并以关键字参数形式传递给视图

    urls.py

    url('^book/(d)/(d+)',views.book)

    FBV和CBV

    FBV

    FBV(function base views) 就是在视图里使用函数处理请求

    from django.http import HttpResponse
      
    def my_view(request):
         if request.method == 'GET':
                return HttpResponse('OK')

    CBV

    CBV(class base views) 就是在视图里使用处理请求

    from django.http import HttpResponse
    from django.views import View
      
    class MyView(View):
          def get(self, request):
                return HttpResponse('OK')

    CBV中urls.py的写法

    url('^book/(d)/(d+)',views.Book.as_view())

    CBV的本质

      Django的url是将一个请求分配给可调用的function的,而不是一个class。

      针对这个问题,class-based view提供了一个as_view()静态方法(也就是类方法)

      调用这个方法,会创建一个类的实例,然后通过实例调用dispatch()方法

      dispatch()方法会根据request的method的不同调用相应的方法来处理request(如get() ,post() 等)。

      到这里,这些方法和FBV差不多了,要接收request,得到一个response返回。

      如果方法没有定义,会抛出HttpResponseNotAllowed异常。

    CBV相对于FBV的优点

    1. 提高了代码的复用性,可以使用面向对象的技术

    2. 可以用不同的函数针对不同的HTTP方法处理,而不是通过很多if判断,提高代码可读性

  • 相关阅读:
    纳米丸穿透癌细胞(癌症)
    Linux生成动态库系统
    Unity3d在线游戏Socket通讯
    TCP/UDP差异
    Android 录音
    使用八种牛云存储解决方案ios7.1的app部署问题
    Android Studio如何设置自己主动提示代码
    QML Image得到的图片资源路径的详细信息
    大约php,mysql,html数字寻呼和文本分页2分页样式供大家参考
    基础总结篇之中的一个:Activity生命周期
  • 原文地址:https://www.cnblogs.com/libolun/p/13679582.html
Copyright © 2020-2023  润新知