第二章 Django URL路由系统

第一章 Django 基本使用
第二章 Django URL路由系统
第三章 Django 视图系统
第四章 Django 模板系统
第五章 Django 数据模型系统(基本使用)
第六章 Django 数据模型系统(多表操作)
第七章 Django 用户认证与会话技术
第八章 Django CSRF防护



URL路由系统基本使用

URL路由系统介绍

路由系统就是URL路径和视图函数的一个对应关系,也可以称为转发器

URL配置

URL路由系统格式
# devops/urls.py
urlpatterns = [
    path(regex,view,kwargs=None,name=None)
]
  • urlpatterns:一个列表,每一个path()函数是一个元素,对应一个视图
  • regex:一个字符串或者正则表达式,匹配URL
  • view:对应一个函数视图或者类视图(as_view()的结果),必须返回一个HttpResponse对象,Django将这个对象转换成一个HTTP响应
  • kwargs:可选,字典形式数据传递给对应视图
  • name:可选,URL名称
例子
from django.urls import path
from myapp import views as t

urlpatterns = [
    path('logs',t.logs,name="logs"), # /logs访问
]

URL路由分发

URL路由分发好处:urls配置解耦,方便管理
在这里插入图片描述

示例

主配置文件

# devops/urls.py
from django.urls import path,include

urlpatterns = [
    path('myapp/',include('myapp.urls')), # /logs访问
]

分发配置文件

# devops/myapp/urls.py
from django.urls import path
from myapp import views
urlpatterns = [
    path('logs',views.logs)
]

访问格式

49.232.221.200是我本机的IP,你们这里替换成自己的
http://49.232.221.200:8888/myapp/logs
在这里插入图片描述

URL正则匹配

年月日正则

"""
格式:yyyymmddHHMMSS

年:\d{4}   yyyyy
月:0[1-9]|1[0-2] mm
日:0[1-9]|[1-2][0-9]|3[0-1] dd
时:0[0-9]|1[0-9]|2[0-3]   HH
分:[0-5][0-9]  MM
秒:[0-5][0-9]  SS
"""

示例

注意

分组匹配内容会传递到函数视图位置参数
正则匹配是从左到右,URL匹配是从上到下,如果匹配就返回
$ 是精确匹配

路由

devops/urls.py

"""
文章归档案例:
http://ip:port/articles/2022        # 返回2022年文章列表
http://ip:port/articles/2022/11     # 返回2022年11月文章列表
http://ip:port/articles/2022/11/123 # 查看ID为123的文章
"""
from django.urls import path,re_path
from myapp import views0

urlpatterns = [
    re_path('^articles/([0-9]{4})/$',views.articles_year),
    re_path('^articles/([0-9]{4})/(0[1-9]|1[0-2])/$',views.articles_month),
    re_path('^articles/([0-9]{4})/(0[1-9]|1[0-2])/([0-9]+)/$',views.articles_id),
]

视图

# devops/myapp/views.py
from django.shortcuts import render,HttpResponse
def articles_year(request,year):
    return HttpResponse("返回%s年文章列表" %year)

def articles_month(request,year,month):
    return HttpResponse("返回%s年%s月文章列表" %(year,month))

def articles_id(request,year,month,id):
    return HttpResponse("返回%s年%s月ID=%s文章列表" %(year,month,id))

验证

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

URL名称解析

命名分组语法

(?P<name>pattem) 
  • name是名称
  • pattern是匹配的正则表达式

示例

路由

# devops/urls.py
"""
文章归档案例:
http://ip:port/articles/2022        # 返回2022年文章列表
http://ip:port/articles/2022/11     # 返回2022年11月文章列表
http://ip:port/articles/2022/11/123 # 查看ID为123的文章
"""
from django.urls import path,include,re_path
from myapp import views

urlpatterns = [
    path('myapp/',include('myapp.urls')), # /logs访问
    re_path('^articles/(?P<year>[0-9]{4})/$',views.articles_year),
    re_path('^articles/(?P<year>[0-9]{4})/(?P<month>0[1-9]|1[0-2])/$',views.articles_month),
    re_path('^articles/(?P<year>[0-9]{4})/(?P<month>|0[1-9]|1[0-2])/(?P<id>[0-9]+)/$',views.articles_id),
]

视图

# devops/myapp/views.py
def articles_year(request,year):
    return HttpResponse("返回%s年文章列表" %year)

def articles_month(request,month,year):
    return HttpResponse("返回%s年%s月文章列表" %(year,month))

def articles_id(request,year,id,month):
    return HttpResponse("返回%s年%s月ID=%s文章列表" %(year,month,id))

URL名称

在前端代码里经常指定URL,例如超链接,提交表单等,这是用URL反查就方便多了

之前

<a href="/hello">您好</a>

之后

<a href="{% url 'hello' %}">您好</a>

示例

路由

# devops/urls.py
from django.urls import path
from myapp import views

urlpatterns = [
    path('hello/',views.hello), # /logs访问
    path('hhh/',views.hhh,name='zhi'), # /logs访问
    path('logs/',views.logs), # /logs访问
]

视图

from django.shortcuts import render,HttpResponse
# Create your views here.
def logs(request):
    import os
    cur = os.path.dirname(os.path.abspath(__file__))
    with open(cur + '/access.log',encoding='utf8') as f:
    # with open('/data/devops/myapp/access.log',encoding='utf8') as f:
        result = f.read()
    return render(request,'logs.html',{
   'result': result })

def hello(request):
    return HttpResponse("跳到了之前")

def hhh(request):
    return HttpResponse("跳到了之后")

模板

# tenplates/logs.html
<!DOCTYPE html>
<html lang="en">
    <head>
        <meta charset="UTF-8">
        <title>日志</title>
    </head>
    <body>
        <h1>Nginx访问日志</h1>
        <pre style="color: red">{
   {
    result }}</pre>
        <a href="/hello">之前</a>
        <a href="{% url 'zhi' %}">之后</a>
    </body>
</html>

验证

在这里插入图片描述
点击之前
在这里插入图片描述
点击之后
在这里插入图片描述

相关推荐

  1. 第22-协议概述

    2023-12-12 09:00:04       30 阅读
  2. 第20-IP原理

    2023-12-12 09:00:04       34 阅读
  3. 第五 静态

    2023-12-12 09:00:04       31 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2023-12-12 09:00:04       94 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2023-12-12 09:00:04       100 阅读
  3. 在Django里面运行非项目文件

    2023-12-12 09:00:04       82 阅读
  4. Python语言-面向对象

    2023-12-12 09:00:04       91 阅读

热门阅读

  1. Linux-RedHat系统-安装 中间件 Tuxedo

    2023-12-12 09:00:04       60 阅读
  2. 【前端设计模式】之解释器模式

    2023-12-12 09:00:04       57 阅读
  3. 在Go中定义方法

    2023-12-12 09:00:04       67 阅读
  4. 【常用字符大全】含emoji表情

    2023-12-12 09:00:04       48 阅读
  5. MT1509 查找子串2(BF)

    2023-12-12 09:00:04       57 阅读
  6. SpringCloud常见问题

    2023-12-12 09:00:04       50 阅读
  7. Redis Helper封装:静态方法

    2023-12-12 09:00:04       51 阅读