• django—路由匹配、函数视图、类视图、获取请求参数


    一、路由匹配规则

    什么是路由?
    url与后端视图之间的映射条目
    1.urls.py存放的是全局路由信息
    2.urlpatterns为存放路由条目的列表
    3.urlpatterns列表中的元素个数为路由条数

    路由匹配规则
    a.urlpatterns列表中从上到下进行匹配
    b.如果匹配不成功,那么会往下匹配
    c.如果当前路由匹配成功,会自动调用path函数第二个参数的函数
    d.一旦路由匹配成功,那么不会继续往下匹配
    e.如果所有的路由都匹配不成功,会抛出404异常(返回404页面)

    urlpatterns = [
        # path('admin/', admin.site.urls),
        path('projects/<int:pk>/', index),
        path('projects1/11/', index1),
        path('projects11/', index1),
        re_path(r'^projects11/$', index1),
        re_path(r'^projects/(?P<pk>d{2})/$', index),
        path('projects/', include('projects.urls')), # 子路由
    ]

    path函数
    1、用于定义路由条目

    • 第一个参数为url路径, 默认最后的“/”需要添加
    • 第二个参数为需要调用的函数,直接使用函数名即可

    2、可以在定义路由条目时,接收路径参数

    • <类型转化器:参数名称>
    • int、str、slug、uuid等
    • 会接收一个关键字参数,调用视图函数时,会自动以关键字参数的形式传递过去

    3、如果path函数的第二个参数为include,那么会进入到子路由中继续匹配
    include函数

    • 需要指定子路由的路径
    • '子应用名称.urls'
    • 在子项目中创建一个url.py文件用来存放子路由

    re_path函数
    可以使用re_path来定义路由条目
    a.支持正则表达式
    b.固定形式r'^路径或者正则表达式/$'

    二、视图

    注:发起GET、OPTIONS以外的请求,例如post,需要改settings.py配置

    from django.http import HttpResponse, JsonResponse
    from django.shortcuts import render
    
    # Create your views here.
    from django.views import View
    
    
    def index(request, pk):
        """
        视图函数
        a.为HttpRequest对象,存放了用户所有的请求信息
        b.可以使用HttpRequest对象中method属性获取请求方法
        c.通过不同的请求方法,执行不同的逻辑
        :param request: 为HttpRequest对象,存放了用户所有的请求信息
        :param pk:
        :return:
        """
        # return HttpResponse('Hello')
        if request.method == 'GET':
            return HttpResponse(f'GET请求:pk为{pk}')
        elif request.method == 'POST':
            return HttpResponse(f'POST请求:pk为{pk}')
        else:
            return HttpResponse(f'其他请求:pk为{pk}')
    
    
    def index1(request):
        return HttpResponse('<h1>Hello!</h1>')
    
    
    class ProjectViews(View):
        """
        定义类视图
        a.必须得继承View父类或者View子类
        b.不同的请求方式,是以不同请求方法一一对应的
        c.请求方式与请求方法的对应关系
            GET  ->  get
            POST -> post
            PUT  -> put
            DELETE -> delete
        """
    
        def get(self, request, pk):
            """
            a.第一个参数为ProjectViews对象
            b.第二个参数为HttpRequest对象
            :param request:
            :param pk:
            :return:
            """
            # 假设当前datas是从数据库中读取的
            datas = [
                {
                    "project_name": "项目11",
                    "leader": "xx",
                    "app_name": "平台应用"
                },
            ]
            # 将前端工程师提供的html页面转化为django中的模板
            # return HttpResponse(f'GET请求:pk为{pk}')
            # return render(request, 'index.html', context=locals())
            return JsonResponse(data=datas, safe=False)
    
        def post(self, request, pk):
            return HttpResponse(f'POST请求:pk为{pk}')
    
        def put(self, request, pk):
            return HttpResponse(f'PUT请求:pk为{pk}')

    三、获取请求参数

    1.query string 查询字符串参数:?name=wuren&age=18

    • a.可以使用request.GET获取
    • b.request.GET是QueryDict类型,可以类比为python中的dict类型
    • c.可以使用request.GET['参数名'] 或者 使用request.GET.get('参数名')
    • d.可以获取多个相同key的查询字符串参数
    • e.使用request.GET['参数名'] 或者 使用request.GET.get('参数名'),获取的是最后一个参数
    • f.request.GET.getlist('参数名'),获取所有的参数,且为列表类型

    2.在POST请求体中,可以传递请求体参数(x-www-form-urlencoded)

    • a.可以使用request.POST


    3.在POST请求体中,可以传递请求体参数(application/json)

    • a.可以使用request.body来获取所有请求体参数
    • b.需要使用json模块转化为字典之后再提取值
    • json_str = request.body.decode('utf-8')
      json_dict = json.loads(json_str)


    4.在请求体中,可以传递请求体参数(mutilpart/form-data)

    • a.传递的文本参数可以使用request.POST去获取
    • b.传递的非文本参数可以使用request.body去获取


    5.可以在请求头中传递参数

    • a.可以使用request.META获取请求头参数,是一个字典类型
    • b.请求头中的参数key:HTTP_参数名大写
    import json
    
    from django.http import HttpResponse, JsonResponse
    from django.shortcuts import render
    
    # Create your views here.
    from django.views import View
    
    
    def index(request, pk):
        """
        视图函数
        a.为HttpRequest对象,存放了用户所有的请求信息
        b.可以使用HttpRequest对象中method属性获取请求方法
        c.通过不同的请求方法,执行不同的逻辑
        :param request: 为HttpRequest对象,存放了用户所有的请求信息
        :param pk:
        :return:
        """
        # return HttpResponse('Hello, 测试开发六期的大佬们!')
        if request.method == 'GET':
            return HttpResponse(f'GET请求:pk为{pk}')
        elif request.method == 'POST':
            return HttpResponse(f'POST请求:pk为{pk}')
        else:
            return HttpResponse(f'其他请求:pk为{pk}')
    
    
    def index1(request):
        return HttpResponse('<h1>Hello, dev06的大佬们!</h1>')
    
    
    class ProjectViews(View):
        """
        定义类视图
        a.必须得继承View父类或者View子类
        b.不同的请求方式,是以不同请求方法一一对应的
        c.请求方式与请求方法的对应关系
            GET  ->  get
            POST -> post
            PUT  -> put
            DELETE -> delete
        d.每一个实例请求方法必须得返回HttpResponse对象或者HttpResponse子类对象
        """
        def get(self, request, pk):
            """
            a.第一个参数为ProjectViews对象
            b.第二个参数为HttpRequest对象
            :param request:
            :param pk:
            :return:
            """
            # 1.query string 查询字符串参数:?name=wuren&age=18
            # a.可以使用request.GET获取
            # b.request.GET是QueryDict类型,可以类比为python中的dict类型
            # c.可以使用request.GET['参数名'] 或者 使用request.GET.get('参数名')
            # d.可以获取多个相同key的查询字符串参数
            # e.使用request.GET['参数名'] 或者 使用request.GET.get('参数名'),获取的是最后一个参数
            # f.request.GET.getlist('参数名'),获取所有的参数,且为列表类型
            # 假设当前datas是从数据库中读取的
            datas = [
                {
                    "project_name": "前程贷项目11",
                    "leader": "唯一",
                    "app_name": "P2P平台应用"
                },
                {
                    "project_name": "探索火星项目",
                    "leader": "优优",
                    "app_name": "吊炸天应用"
                },
                {
                    "project_name": "无比牛逼的项目",
                    "leader": "可可",
                    "app_name": "神秘应用"
                },
            ]
            # 将前端工程师提供的html页面转化为django中的模板
            # return HttpResponse(f'GET请求:pk为{pk}')
            # return render(request, 'index.html', context=locals())
            # a.使用JsonResponse可以返回json数据
            # b.如果第一个参数为字典,那么无需指定safe关键字参数
            # c.如果第一个参数为嵌套字典的列表,那么必须指定safe=False关键字参数
    
            # HttpResponse或者JsonResponse,可以使用status来指定响应状态码
            return JsonResponse(data=datas, safe=False, status=201)
    
        def post(self, request, pk):
            # 2.在POST请求体中,可以传递请求体参数(x-www-form-urlencoded)
            # a.可以使用request.POST
            #
            # 3.在POST请求体中,可以传递请求体参数(application/json)
            # a.可以使用request.body来获取所有请求体参数
            # b.需要使用json模块转化为字典之后再提取值
            # json_str = request.body.decode('utf-8')
            # json_dict = json.loads(json_str)
            #
            # 4.在请求体中,可以传递请求体参数(mutilpart/form-data)
            # a.传递的文本参数可以使用request.POST去获取
            # b.传递的非文本参数可以使用request.body去获取
            #
            # 5.可以在请求头中传递参数
            # a.可以使用request.META获取请求头参数,是一个字典类型
            # b.请求头中的参数key:HTTP_参数名大写
            return HttpResponse(f'POST请求:pk为{pk}')
    
        def put(self, request, pk):
            return HttpResponse(f'PUT请求:pk为{pk}')
  • 相关阅读:
    LETTers比赛第十二场解题报告
    LETTers练习赛第十场 第四题
    LETTers练习赛第十场 第二题
    LETTers练习赛第十场 第一题
    LETTers练习赛十一场解题报告
    RedHat Enterprise Linux 基本网络配置
    c# 连接MySQL中文乱码问题的解决方法
    [原]iBatis.Net(C#)系列一:简介及运行环境
    ArcGIS 9.3 sp1 下载更新
    [原]iBatis.Net(C#)系列二:SQL数据映射
  • 原文地址:https://www.cnblogs.com/erchun/p/14285541.html
Copyright © 2020-2023  润新知