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

一、路由匹配规则

什么是路由?
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!</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}')

 

posted @ 2021-01-16 12:44  mkay  阅读(541)  评论(0编辑  收藏  举报