请求和响应

定义:统一资源定位符 作用:用来表示互联网上某个资源的地址 如下图:

URL

详细解释各个部分:

URL解释
URL解释

http默认是80,一般不写

URL解释

‘?’后面都是查询字符串,‘&’并。格式为key=value
‘#’后面就是锚点,锚点可以帮我直接定位到网页上的具体位置。

Django处理URL请求

Django处理URL请求
Django处理URL请求

path(‘page/2003’,views.page_2003),
views.page_2003是视图

视图函数

视图函数

注意第一个参数是request
返回值必须是HttpResponse对象
样例:

样例

具体操作:
这部分主要是我们想加一个网页访问时,我们需要如何添加一个新的地址访问,首先我们要找到我们的主路由文件:

其中admin是默认生成的,我们无需修改,然后我们添加如下代码:

1
2
path('page/2003', views.page_2003_view),

注意后面的逗号:
这句话也就是为我们的网站添加一个跳转,也就是127.0.0.1:8000/page/2003/,当用户访问我们的page/2003路由时,Django会查询views.page_2003_view的相关视图。
当我们添加相关的跳转之后,还需要我们去添加这个视图,添加方法如下:

在views.py中添加方法page_2003_view

1
2
3
4
5
6
7
8
from django.http import HttpResponse


def page_2003_view(request):
html = "<h1>这是我的第一个页面</h1>"
return HttpResponse(html)


网站运行结果如下:

路由配置

小练习

代码如下:
urls.py

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
from django.contrib import admin
from django.urls import path
# . 表示当目录下
from . import views

urlpatterns = {
path('admin/', admin.site.urls),
# http://127.0.0.1:8000/page/2003
path('page/2003', views.page_2003_view),
path('',views.page_k),
path('page/1',views.page_1),
path('page/2',views.page_2),


}

views.py

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
from django.http import HttpResponse


def page_2003_view(request):
html = "<h1>这是我的第一个页面</h1>"
return HttpResponse(html)


def page_k(request):
html = "<h1>这是我的首页</h1>"
return HttpResponse(html)


def page_1(request):
html = "<h1>这是编号为1的页面</h1>"
return HttpResponse(html)


def page_2(request):
html = "<h1>这是编号为2的页面</h1>"
return HttpResponse(html)


path转换器

path转换器

转换器类型及作用:

转换器类型及作用

代码如下:
urls.py

1
2
3
path('page/<int:pg>', views.page_view)


views.py

1
2
3
4
def page_view(request, pg):
html = f"这是编号为{str(pg)}的页面"
return HttpResponse(html)

:path的匹配顺序,这里面的匹配顺序是 从上到下 以此匹配的

小练习

效果图

代码如下:
urls.py

1
2
path('<int:pg1>/<str:st>/<int:pg2>', views.reckon),

views.py

1
2
3
4
5
6
7
8
9
10
11
12
def reckon(request, pg1, st, pg2):
if st == 'add':
k = pg1 + pg2
elif st == 'sub':
k = pg1 - pg2
elif st == 'mul':
k = pg1 * pg2
else:
k = '错误!'
html = f'<h1>{str(k)}</h1>'
return HttpResponse(html)

re_path

re_path

re_pathexample

解释一下这个正则表达式:

^ 代表开头 & 代表结束 P 代表正则匹配 < x > 代表我们给他命名为x \d 匹配数字 {1,2} 匹配1-2位 \w+ 匹配字符串

最终实现:

re_pathexample1

代码如下:
urls.py

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
from django.contrib import admin
from django.urls import path, re_path
# . 表示当目录下
from . import views

urlpatterns = {
path('admin/', admin.site.urls),
# http://127.0.0.1:8000/page/2003
path('page/2003', views.page_2003_view),
path('', views.page_k),
path('page/1', views.page_1),
path('page/2', views.page_2),

path('page/<int:pg>', views.page_view),

re_path(r'^(?P<x>\d{1,2})/(?P<op>\w+)/(?P<y>\d{1,2})$', views.cal2_view),

path('<int:pg1>/<str:st>/<int:pg2>', views.reckon),

}

views.py

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
from django.http import HttpResponse


def page_2003_view(request):
html = "<h1>这是我的第一个页面</h1>"
return HttpResponse(html)


def page_k(request):
html = "<h1>这是我的首页</h1>"
return HttpResponse(html)


def page_1(request):
html = "<h1>这是编号为1的页面</h1>"
return HttpResponse(html)


def page_2(request):
html = "<h1>这是编号为2的页面</h1>"
return HttpResponse(html)


def page_view(request, pg):
html = f"这是编号为{str(pg)}的页面"
return HttpResponse(html)


def reckon(request, pg1, st, pg2):
if st == 'add':
k = pg1 + pg2
elif st == 'sub':
k = pg1 - pg2
elif st == 'mul':
k = pg1 * pg2
else:
k = '错误!'
html = f'<h1>{str(k)}</h1>'
return HttpResponse(html)


def cal2_view(request,x,op,y):
if op == 'add':
k = int(x) + int(y)
elif op == 'sub':
k = int(x) - int(y)
elif op == 'mul':
k = int(x) * int(y)
else:
k = '错误!'
html = f'<h1>cal2_view:{str(k)}</h1>'
return HttpResponse(html)


小练习

re_pathxlx

re_pathxlx1

代码如下:
urls.py

1
2
3
re_path(r'^birthday/(?P<x>\d{4})/(?P<y>\d{1,2})/(?P<z>\d{1,2})$',views.birthday_one),
re_path(r'^birthday/(?P<y>\d{1,2})/(?P<z>\d{1,2})/(?P<x>\d{4})$',views.birthday_two),

views.py

1
2
3
4
5
6
7
8
9
10
def birthday_one(request, x, y, z):
html = f"<h1>生日为:{x}{y}{z}日</h1>"
return HttpResponse(html)


def birthday_two(request, x, y, z):
html = f"<h1>生日为:{x}{y}{z}日</h1>"
return HttpResponse(html)


总结

两种匹配方式,当十分严格时使用re_path,一般的匹配使用path即可,re_path书写格式注意,注意正则表达式的写法。