一、路由系统
1.1 文件内容
- 功能: 将路由与视图函数做映射
- 文件路径:
/main/main/urls.py
,见上篇文件目录 - 网址:域名+路由
- 域名:
https://www.baidu.com
,http://127.0.0.1:8000/
- 路由:
/
,/api/
,/api?pwd=123
- 浏览器:注意–>默认会在网址末尾加
/
- 域名:
1.2 路由分类
1.2.1 固定路由
- 释义:精确匹配路由和函数关系
- 主应用代码(/main/main/urls.py)
django.urls import path # 默认就有 from api import views # 调用应用api(文件夹)中的views.py文件 urlpatterns = [ # 调用views.py中的index函数,路由前会自动加“/”,即“/api/”;路由别名:name path("api/", views.index, name="api_index"), ]
- 自定义应用代码(/main/api/views.py)
from django.shortcuts import redirect from django.urls import reverse def index(request): return redirect(reverse("api_index")) # 转到http://127.0.0.1:8000/api/
1.2.2 通配符路由
- 释义:使用正则表达式批量匹配路由
- 主应用代码(/main/main/urls.py)
from django.urls import re_path # 导入通配符路由函数re_path from api import views # 调用应用api(文件夹)中的views.py文件 urlpatterns = [ re_path(r"^$", views.index), # 空路由会被匹配到这里,即“/” ]
- 通配符表
格式 描述 格式 描述 ^ 严格匹配字符串开头 $ 严格匹配字符串末尾 . 任意字符,除了换行符 a? 0、1个a a+ >0个a a* >=0个a [amk] 匹配 ‘a’,‘m’或’k’ ,[0-2]为0、1、2 [^amk] 匹配 ‘a’,‘m’,’k’之外的字符 [0-1]{3} 精确匹配n个表达式,000、111 [0-1]{2,3} 匹配00、11、000、111 (表达式) 分组匹配 (表达式1)|(表达式2) 表达式的或语句 \d 匹配任意数字,等价[0-9] \w 匹配包括下划线的任何单词字符,
等价:[A-Za-z0-9_]和_
\s 匹配任意空白字符 \S 匹配任意非空白字符
1.2.3 路由分发
- 释义: 将路由引导入Django的app应用中的分路由文件中继续分发
- 主应用代码(/main/main/urls.py)
from django.urls import include #导入路由分发函数include from api1 import urls as api1urls urlpatterns = [ # 路由分发,api1/会导向应用api1中的urls.py文件(自己加) path("api1/", include(api1urls) ]
- api1应用中代码(新建文件 /main/api1/urls.py)
from django.urls import path from . import views urlpatterns = [ # 此处路径为"http://127.0.0.1:8000/api1/cal/" path('cal/', views.calculate), # 此处路径为"http://127.0.0.1:8000/api1/“ path("", views.index), ]
1.2.4 路由分组
分组:将路由中与正则表达式匹配的数据转成变量传给视图函数
- 无名分组
- 主应用代码(/main/main/urls.py)
from django.urls import path, re_path from api import views urlpatterns = [ # [0-9]{2}会传给自定义应用中的视图中的month,注意”小括号“ re_path("^index/([0-9]{2})/([0-9]{4})/$",views.index), ]
- 自定义应用代码(/main/api/views.py)
from django.shortcuts import HttpResponse # year, month会接收主应用传过来的参数,注意“有顺序” def index(request,month, year): print('the year is ', year, 'the month is ', month) # 在pycharm终端显示 return HttpResponse('按顺序一一对应传参')
- 主应用代码(/main/main/urls.py)
- 有名分组
- 主应用代码(/main/main/urls.py)
from django.urls import path, re_path from api import views urlpatterns = [ # 用 ”?P<组名>“ 定义组名,以组名向视图函数传参,无顺序 re_path("^index/(?P<month>[0-9]{2})/(?P<year>[0-9]{4})/$",views.index), ]
- 自定义应用代码(/main/api/views.py)
from django.shortcuts import HttpResponse # year,month会根据组名接收主应用传过来的参数 def index(request,year, month): # 注意此处与主应用路由顺序相反,仍能传参 print('the year is ', year, 'the month is ', month) # 在pycharm终端显示 return HttpResponse('按组名一一对应传参')
- 主应用代码(/main/main/urls.py)
二、视图函数
定义:负责接收请求(request),进行逻辑处理,并返回响应(response)的函数
文件位置:自定义应用代码(/main/api/views.py)
2.1 请求体
写法 | 返回值 | 描述 |
---|---|---|
request.method | 请求方法:字符串 | 针对数据库:查’GET’,增’POST’,改’PUT’,删’DELETE’ |
request.POST.get(“user”) | 请求值:字符串 | 获取请求键值对中,键‘user’对应的值 |
request.path | 请求路由:字符串 | 获取请求的路由,例如:‘/index/’ |
2.2 FBV模式
- 定义:function base views,基于函数的视图,就是在视图里使用函数处理请求
- 示例代码:
from django.shortcuts import HttpResponse, redirect def login(request): # 可以传多个参数,但第一个必须为request if request.method == "GET": # 获得请求方法名称,GET:查数据,request无请求体 return HttpResponse("GET 方法") # 向浏览器响应文本信息 if request.method == "POST": # 请求方法名称,POST:增数据,request有请求体 user = request.POST.get("user") # 获得请求体中user的值 pwd = request.POST.get("pwd") # 获得请求体中pwd的值 if user == "runoob" and pwd == "123456": return HttpResponse("登录验证成功") else: # 重定向到路由为login的界面,也可为HttpResponseRedirect("https://baidu.com") return redirect("/") # 重定向发送的是get请求
- 下载postman发送请求
- 下载postman发送请求
错误403:防跨站攻击(CSRF),测试时注释掉setting.py中中间件
#'django.middleware.csrf.CsrfViewMiddleware',
一行即可
2.3 CBV模式
- 定义:class base views,基于类的视图,就是在视图里使用类处理请求
- url.py路由写法:
path('', views.index.as_view())
,只多了as_view()这一段 - 示例代码:
from django.shortcuts import HttpResponse, redirect from django.http import JsonResponse # json模块 from django.views import View # 导入View基类 class login(View): # CBV必须继承这个类 def get(self,request): # 类按请求方法,将请求分发给不同类内的函数 return HttpResponse("GET 方法") def post(self,request): # 类按请求方法,将请求分发给不同类内的函数 user = request.POST.get("user") pwd = request.POST.get("pwd") if user == "jane" and pwd == "123456": data = { 'name': 'zhangsan', 'age': 18, } return JsonResponse(data) # 给浏览器返回json数据格式,配合axios使用 else: return redirect("/") # 重定向发送的是get请求