02_Django-路由配置-HTTP协议的请求和响应

:点击此处或下方 以展开或折叠目录

视频链接:https://www.bilibili.com/video/BV1vK4y1o7jH

一. 路由配置

settings.py中的 `ROOT_URLCONF` 指定了主路由配置列表 urlpatterns 的文件位置

1
2
3
4
5
# file: <项目同名文件夹下>/urls.py
urlpatterns = [
path('page/2003/', views.page_2003_view),
... # 此处配置主路由
]

path()

path()函数

path()函数

导入 - from django.urls import path

语法 - path(route, views, name=None)

参数:

​ 1.route: 字符串类型,匹配的请求路径

​ 2.views: 指定路径所对应的视图处理函数的名称

​ 3.name: 为地址起 别名,在模块中地址反向解析时使用

练习 - 建立一个小网站:

​ 输入网址:http://127.0.0.1:8000, 在网页中输出:这是我的首页

​ 输入网址:http://127.0.0.1:8000/page/1, 在网页中输出:这是编号为1的网页

​ 输入地址:http://127.0.0.1:8000/page/2, 在网页中输出:这是编号为2的网页

1
2
3
http://127.0.0.1:8000
http://127.0.0.1:8000/page/1
http://127.0.0.1:8000/page/2
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
 <项目同名文件夹下>/urls.py
urlpatterns = [
#http://127.0.0.1:8000
path('', views.index_view),
#http://127.0.0.1:8000/page/1
path('page/1', views.page1_view),
#http://127.0.0.1:8000/page/2
path('page/2', views.page2_view)
]

<项目同名文件夹下>/views.py
def index_view(request):
html = '这是我的首页'
return HttpResponse(html)

def page1_view(request):
html = '这是编号为1的网页'
return HttpResponse(html)

def page2_view(request):
html = '这是编号为2的网页'
return HttpResponse(html)

思考

建立如上一百个网页该怎么办?

例如:

http://127.0.0.1:8000/page/3

http://127.0.0.1:8000/page/4

​ …

http://127.0.0.1:8000/page/100

path转换器

语法:<转换器类型: 自定义名>

作用:若转换器类型匹配到对应类型的数据,则将数据按照关键字传参的方式传递给视图函数

例子:path(‘page/<int:page>’, view.xxx)

转换器类型:str、int、slug、path

1
2
3
4
5
6
7
8
9
10
11
12
http://127.0.0.1:8000/page/30

<项目同名文件夹下>/urls.py
urlpatterns = [
#http://127.0.0.1:8000/page/3-100
path('page/<int:pg>', views.pagen_view)
]

<项目同名文件夹下>/views.py
def pagen_view(request, pg):
html = '这是编号为%s的网页!'%(pg)
return HttpResponse(html)

练习:小计算器

​ 定义一个路由的格式为:

​ ==http://127.0.0.1:8000/整数/操作字符串[add/sub/mul]/整数==

​ 从路由中提取数据,做相应的操作后返回给浏览器

​ 效果如下:

​ 输入:127.0.0.1:8000/100/add/200

​ 页面显示结果:300

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
http://127.0.0.1:8000/100/add/200
结果为:300

<项目同名文件夹下>/urls.py
urlpatterns = [
#http://127.0.0.1:8000/整数/操作符/整数
path('<int:n>/<str:op>/<int:m>', views.cal_view)
]

<项目同名文件夹下>/views.py
def cal_view(request, n, op, m):
if op not in ['add', 'sub', 'mul']:
return HttpResponse('Your op is wrong')
result = 0
if op == 'add':
result = n + m
elif op == 'sub':
result = n - m
elif op == 'mul':
result = n * m
return HttpResponse('结果为:%s'%(result))

re_path()

re_path()函数

re_path()函数

在 url 的匹配过程中可以使用正则表达式进行精确匹配

语法:

​ re_path(reg, view, name=xxx)

​ 正则表达式为命名分组模式(**?P<name>**pattern); 匹配提取参数后用关键字传参方式传递给视图函数

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
样例
# 可匹配 http://127.0.0.1:8000/20/mul/40
# 不可匹配 http://127.0.0.1:8000/200/mul/400

http://127.0.0.1:8000/10/add/20 -> x:10 op:add y:20

<项目同名文件夹下>/urls.py
from django.urls import path, re_path

urlpatterns = [
#http://127.0.0.1:8000/整数2/操作符/整数2
re_path(r'^(?P<x>\d{1,2})/(?P<op>\w+)/(?P<y>\d{1,2})$', views.cal2_view),
] # \d 整数; \w 字符

<项目同名文件夹下>/views.py
def cal2_view(request, x, op, y):
html = 'x:%s op:%s y:%s'%(x, op, y)
return HttpResponse(html)

练习

访问地址:

http://127.0.0.1:8000/birthday/四位数字/一到两位数字/一到两位数字

http://127.0.0.1:8000/birthday/一到两位数字/一到两位数字/四位数字

最终输出:生日为:xxxx年xx月xx日

效果样例:

​ 输入网址:http://127.0.0.1:8000/birthday/2015/12/11

​ 显示为:生日为:2015年12月11日

​ 输入网址:http://127.0.0.1:8000/birthday/2/28/2008

​ 显示为:生日为:2008年2月28日

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
http://127.0.0.1:8000/birthday/1992/01/01
生日为1992年01月01日

<项目同名文件夹下>/urls.py
urlpatterns = [
#http://127.0.0.1:8000/birthday/年4/月2/日2
re_path(r'^birthday/(?P<y>\d{4})/(?P<m>\d{1,2})/(?P<d>\d{1,2})$', views.birthday_view),
#http://127.0.0.1:8000/birthday/月2/日2/年4
re_path(r'^birthday/(?P<m>\d{1,2})/(?P<d>\d{1,2})/(?P<y>\d{4})$', views.birthday_view),
]

<项目同名文件夹下>/views.py
def birthday_view(request, y, m, d):
html = "生日为%s年%s月%s日"%(y, m, d)
return HttpResponse(html)

Django Day02

请求和响应

GET请求和POST请求

Django的设计模式及模板层

模板层 - 变量和标签

模板层 - 过滤器和继承

url反向解析


二. HTTP协议的请求和响应

定义

请求是指浏览器端通过HTTP协议发送给服务器端的数据

​ 响应是指服务器端接收到请求后做相应的处理后再回复给浏览器端的数据

请求

请求样例

请求样例

请求中的方法

根据HTTP标准,HTTP请求可以使用多种请求方法

HTTP1.0定义了三种请求方法:GET,POST和HEAD方法(最常用)

HTTP1.1新增了五种请求方法:OPTIONS,PUT,DELETE,TRACE和CONNECT方法

Django中的请求

请求在Django中实则就是 视图函数的第一个参数,即HttpRequest对象

Django接收到http协议的请求后,会根据请求数据报文创建HttpRequest对象

HttpRequest对象 通过属性 描述了 请求的 所有相关信息

·path_info:URL字符串

·method:字符串,表示HTTP请求方法,常用值:`GET``POST`

·GETQueryDict查询字典的对象,包含get请求方法的所有数据

·POST:QueryDict查询字典的对象,包含post请求方式的所有数据

·FILES:类似于字典的对象,包含所有的上传文件信息

·COOKIES:Python字典,包含所有的cookie,键和值都为字符串

·session:似于字典的对象,表示当前的会话

·body:字符串,请求体的内容(POST或PUT)

·scheme:请求协议(‘http’/‘https’)

·request.get_full_path():请求的完整路径

·request.META:请求中的元数据(消息头)

​ - request.META[‘REMOTE_ADDR’]:客户端IP地址

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
http://127.0.0.1:8000/test_request?a=1&b=1
test request ok
终端
path info is /test_request
method is GET
querystring is <QueryDict: {'a': ['1'], 'b': ['1']}>
full path is /test_request?a=1&b=1
[20/Dec/2021 23:27:09] "GET /test_request?a=1&b=1 HTTP/1.1" 200 15

<项目同名文件夹下>/urls.py
urlpatterns = [
path('test_request', views.test_request)
]

<项目同名文件夹下>/views.py
def test_request(request):
print('path info is', request.path_info)
print('method is', request.method)
print('querystring is', request.GET)
print('full path is', request.get_full_path())
return HttpResponse('test request ok')

响应

响应样例

响应样例

响应状态码

HTTP状态码的英文为HTTP Status Code

下面是常见的HTTP状态码:

- 200 - 请求成功

- 301 - 永久重定向-资源(网页等)被永久转移到其它URL

- 302 - 临时重定向

- 404 - 请求的资源(网页等)不存在

- 500 - 内部服务器错误

HTTP状态码由三个十进制数字组成,第一个十进制数字定义了状态码的类型,后两个数字没有分类的作用。HTTP状态码共分为5种类型:

Django中的响应对象

构造函数格式:

​ HttpResponse(content=响应体, content_type=响应体数据类型, status=状态码)

作用:

​ 向客户端浏览器返回响应,同时携带响应体内容

常用的**Conten-Type**如下

- ‘text/html’(默认的,html文件)

- ‘text/plain’(纯文本)

- ‘text/css’(css文件)

- ‘text/javascript’(js文件)

- ‘multipart/form-data’(文件提交)

- ‘application/json’(json传输)

- ‘application/xml’(xml文件)

------------------------------------------------------------------

HttpResponse子类

1
2
3
4
5
6
7
8
9
10
11
12
13
http://127.0.0.1:8000/test_request
=> http://127.0.0.1:8000/page/1

<项目同名文件夹下>/urls.py
urlpatterns = [
path('test_request', views.test_request)
]

<项目同名文件夹下>/views.py
from django.http import HttpResponse, HttpResponseRedirect

def test_request(request):
return HttpResponseRedirect('/page/1')