Django-3-网址和网页内容的”红娘“-路由配置

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.pyviews.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```

参考

达内教育

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值