urls.py路由配置-path
示例:配置127.0.0.1:8000为主页
在配置路由的时候,需要首先从django导入path
# urls.py
from django.urls import path
from . import views # 在url.py同级目录新建views.py文件,在其中写上视图函数,在path中通过"views.视图函数"来调用
配置主页路由:
urlpatterns = [
path('', views.home),#资源地址设置成空,注意不能包含空格,末尾包含逗号,因为这是数组
]
# 因为想直接通过127.0.0.1:8000访问,因此这里的路由为空,且不能为" "此格式
在url.py同级目录新建views.py文件,在其中写上视图函数,在path中通过"views.视图函数"来调用
views.py
from django.http import HttpResponse # 导入响应模块
# 定义视图函数
def home(request):
return HttpResponse('ok')
自然的,如果要求增加其他网址,例如http://127.0.0.1/page/1,http://127.0.0.1/page/2,也不在话下,只需要在urls.py中写好路由及其试图函数,并在views.py写好视图函数即可
urls.py
urlpatterns = [
path('', views.home),#资源地址设置成空,注意不能包含空格,末尾包含逗号,因为这是数组
path('page/1', views.page1) # http://127.0.0.1/page/1
path('page/2', views.page2) # http://127.0.0.1/page/2
]
但是,如果现在的需求是创建100个页面呢?这个时候就需要对path
的其他用法有所了解了
path
语法
path(route, views, Name = None)
1.route,字符串,匹配请求的路径
2.views,指定路径对应的视图函数
3.Name,为地址起名,在模板中进行地址反向解析
- 使用route配置转换器增强route匹配范围,语法:
path('page/<int:name>', views.xxx) # 通过<指定类型: 指定名称>,指定名称可以用于views函数中的
类型 | 说明 | 示例 |
---|---|---|
整型int | 匹配0或者任意正整数地址 | ‘page/int:pg’匹配’page/1000’ |
字符串str | 匹配除了’/'之外所有非空字符串 | ‘page/str:pg’匹配’page/hello’ |
slug | 匹配包含连字符的网址 | ‘page/slug:pg’匹配’page/hello-word’ |
path | 匹配包含’/'的网址 | ‘page/path:pg’匹配’page/a/b/c’ |
注意,在匹配url模式时是从上而下,从左向右,一旦匹配到合适的后续模式将被跳过 | ||
另外,除了int外其他三种类型接收的参数值都是字符串格式 |
- 练习,构建一个基于网址的计算器,格式如http://127.0.0.1/整数/操作符[add/sub/mul/dev]/整数
urls.py
# 配置一个计算器网址http://127.0.0.1/整数/操作符[add/sub/mul/div]/整数
urlpatterns = [
path('<int:num1>/<str:opt>/<int:num2>', views.cal), # 三个变量接收三个参数
]
views.py
def cal(request, num1, opt, num2):
if opt not in ['add', 'sub', 'mul', 'div']:
return HttpResponse('opt is wrong, add/sub/mul/div is allowed')
if opt == 'add':
res = num1 + num2
elif opt == 'sub':
res = num1 - num2
elif opt == 'mul':
res = num1 * num2
else:
res = num1 / num2
return HttpResponse('%s %s %s = %s' % (num1, opt, num2, res))
例如输入http://127.0.0.1:8000/99/mul/99,返回9801
更强大的正则匹配re_path
如果想要实现更为精准的匹配,使用re_path
更好
- 语法
re_path(route, views, Name)
# 需要注意的是route需要使用正则命名分组的形式:
re_path( ‘r(?P<name1>pattern1)/(?P<name2>pattern2)...$', views)
(?P<>)
是固定写法表示正则分组,name表示该匹配字段名称- re_path属于django.urls,与 path是同级,需要提前导入
注意,正则匹配的值都是字符串格式,如果要做计算需要做类型转换 - 示例,接着上面示例,这里限制只计算2位数以内的计算,即可以匹配http://127.0.0.1:8000/99/mul/99,但不可以匹配http://127.0.0.1:8000/909/mul/99
from django.contrib import admin
from django.urls import path, re_path # re_path与path是同级
from . import views # 从当前目录导入写好的views.py文件
# 配置一个计算器网址http://127.0.0.1/整数/操作符[add/sub/mul/div]/整数
urlpatterns = [
path('admin/', admin.site.urls),
re_path(r'^(?P<num1>\d{1,2})/(?P<opt>\w+)/(?P<num2>\d{1,2})$', views.cal),
]
views.py
def cal(request, num1, opt, num2):
num1 = int(num1) # 正则返回值为字符串,需要先做类型转换
num2 = int(num2)
if opt not in ['add', 'sub', 'mul', 'div']:
return HttpResponse('opt is wrong, add/sub/mul/div is allowed')
if opt == 'add':
res = num1 + num2
elif opt == 'sub':
res = num1 - num2
elif opt == 'mul':
res = num1 * num2
else:
res = num1 / num2
return HttpResponse('%s %s %s = %s' % (num1, opt, num2, res))
两位数以内的可以输出结果,如果出现三位数则提示无法匹配到正确网址
- 在配置路由的时候不能包含空格,例如"/home 1",否则会提示URL route ‘home 1/’ cannot contain whitespace.
路由分应用配置
-
问题:我们的网址往往比较复杂,以一个学生成绩管理系统为例,可能包含
students/xxx
的学生页面,也包含teachers/xxx
的教师页面,如果都写在一个主路由文件下,路径长,数量多,不便于管理 -
解决方法:创建不同的应用来分别管理不同模块的的路由,主路由建立起与各个模块的路由包含关系即可,总体结构如下:
-
步骤:这里假设已经通过
python startproject UCAS
创建了一个项目
1.在主路由UCAS/urls.py
中写上需要包含的应用模块路由地址
# path用于对应路由地址和试图函数, include用于建立起主路由与各个应用模块的包含关系
from django.urls import path, include
urlpatterns = [
path('admin/', admin.site.urls),
# 学生页面路由地址students/xxx由studets.urls管理,通过startapp students创建,并在其目录下的urls文件中写入次级路由关系
path('students/', include('students.urls')),
# 教师页面路由地址teachers/xxx由teachers.urls管理
path('teachers/', include('teachers.urls')),
]
2.创建上述应用模块
python.exe .\manage.py startapp students
python.exe .\manage.py startapp teachers
3.依次打开每个应用下的urls.py
和views.py
,在各个应用模块中写上次级路由地址和视图函数,这里以students app为例,在urls.py中
from django.urls import path
from students.views import * # 导入改应用下的所有视图函数
urlpatterns = [
path('stu1/', stu1), # 路由为UCAS.urls的路由students加上这里的,即students/stu1是最终访问地址
]
在views.py中:
from django.http import HttpResponse
from django.shortcuts import render
# Create your views here.
def stu1(request):
return(HttpResponse('student 1'))
最终效果是:
局域网内访问
- 1.在
settings.py
中,允许所有ip
ALLOWED_HOSTS = ['*']
- 2.查询自己电脑ip
- 3.启动指定ip
python3 manage.py runserver 192.168.43.170:8000```