一、路由匹配规则
什么是路由?
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}')