Django——路由配置

本文介绍了如何在Django项目中使用视图函数处理HTTP请求,包括硬匹配路径、使用内置转换器如int、slug和正则表达式进行路径解析,以及实操示例。

目录

1 概念介绍

1.1 视图函数

1.2 主路由

2 实操

2.1 字符串匹配

2.2 path转换器

2.3 正则匹配


1 概念介绍

1.1 视图函数

  • 视图函数是用于接收一个浏览器请求并通过HttpResponse对象返回数据的函数。此函数可以接收浏览器请求并根据业务逻辑返回相应的内容给浏览器

  • 视图处理的函数的语法格式:

    def xxx_view(request[, 其它参数...]):
        return HttpResponse对象
  • 参数:

    • request用于绑定HttpRequest对象,通过此对象可以获取浏览器的参数和数据
  • 示例:

    • 视图处理函数 views.py 

      # file : <项目名>/views.py
      from django.http import HttpResponse
      def page1_view(request):
          html = "<h1>这是第1个页面</h1>"
          return HttpResponse(html)

1.2 主路由

  • settings.py 中的 ROOT_URLCONF 指定了主路由配置列表urlpatterns的文件位置 
  • settings.py 同路径下的 urls.py 主路由配置文件
    # file : <项目名>/urls.py
    urlpatterns = [
        url(r'^admin/', admin.site.urls),
        ...  # 此处配置主路由
    ]
    urlpatterns 是一个路由-视图函数映射关的列表,此列表的映射关系由url函数来确定

2 实操

本小节主要是为了介绍路径匹配的实际应用,主要分为三种方法:字符串(硬匹配)、path转换器和正则匹配。

2.1 字符串匹配

该类型匹配比较“暴力”,就是通过路径中的字符串进行硬匹配,简单粗暴。使用方法如下:

  • urlpatterns
    urlpatterns = [
        # http://127.0.0.1:8000/
        path('', views.index_view),
    
        # http://127.0.0.1:8000/page/1/
        path('page/1/', views.page1),
    
        # http://127.0.0.1:8000/page/2/
        path('page/2/', views.page2),
    
        # http://127.0.0.1:8000/page/2003/
        path('page/2003/', views.page2003_view)
    ]
  • 视图函数
    from django.http import HttpResponse
    
    
    def index_view(request):
        html = "<h1>这是首页</h1>"
        return HttpResponse(html)
    
    
    def page1(request):
        html = "<h1>这是编号为1的网页</h1>"
        return HttpResponse(html)
    
    
    def page2(request):
        html = "<h1>这是编号为2的网页</h1>"
        return HttpResponse(html)
    
    
    def page2003_view(request):
        html = "<h1>这是这是编号为2003页面</h1>"
        return HttpResponse(html)

2.2 path转换器

Django有默认自带的path转换器,当然, 您也可以自定义path转换器

  • 用法: <转换器类型:自定义名称>
  • 作用: 若转换器类型匹配到对应类型的数据,则将数据按照关键字传参的方式传递给视图函数。

下面只介绍几种常用的Django自带的path转换器:

      转换器类型       作用
str

除了斜杠 '/' 以外的非空字符串

"v1/user/<str:username>"匹配 /v1/user/jason 

int

匹配0个或任意多个正整数,返回int

"page<int:page>" 匹配 /page/100

slug

匹配由 '-' 或者 '_' 连接的字母或数字的组合

"detail/<slug:sl>" 匹配 /detail/this-is_django

path

所有字符(包括 '/')

"v1/user/<path:ph>" 匹配 /v1/user/a/b/c

uuid

只匹配满足 uuid.uuid4() 这个函数返回的字符串

"detail/<uuid:ud>" 匹配  /detail/5aa2892d-8aaa-4509-89e0-7e11579fa993 

注意:不能与slug同时存在,否则可能会被误匹配到slug

用path转换器记得在视图函数中传递参数

  • urlpatterns 
    urlpatterns = [
    
        # http://127.0.0.1:8000/pageNum/?
        path('page_num/<int:page_number>', views.page_num),
    
        # http://127.0.0.1:8000/v1/users/a/b/c
        path('v1/users/<path:ph>', views.path_view),
    
        # http://127.0.0.1:8000/detail/hello-world
        path('detail/<slug:sl>', views.slug_view),
    
        # http://127.0.0.1:8000/detail/5aa2892d-8aaa-4509-89e0-7e11579fa993
        path('detail/<uuid:ud>', views.uuid_view),
    
    ]
  • 视图函数 
    from django.http import HttpResponse
    
    
    def page_num(request, page_number):
        print(type(page_number))
        html = "<h1>这是编号为%d的网页</h1>" % page_number
        return HttpResponse(html)
    
    
    def path_view(request, ph):
        html = "<h1>path网页:" + ph + "</h1>"
        return HttpResponse(html)
    
    
    def slug_view(request, sl):
        html = "<h1>slug网页:" + sl + "</h1>"
        return HttpResponse(html)
    
    
    def uuid_view(request, ud):
        html = "<h1>uuid网页:" + str(ud) + "</h1>"
        return HttpResponse(html)

2.3 正则匹配

在 path() 函数中用正则表达式分组 (?P<name>pattern) 提取参数后用函数关键字传参传递给视图函数

  • urlpatterns 
    urlpatterns = [
        # http://127.0.0.1:8000/birthday/1996/02/26
        re_path(r'^birthday/(?P<year>\d{4})/(?P<month>\d{1,2})/(?P<day>\d{1,2})$', views.birthday_view),
    
        # http://127.0.0.1:8000/birthday/02/26/1996
        re_path(r'^birthday/(?P<month>\d{1,2})/(?P<day>\d{1,2})/(?P<year>\d{4})$', views.birthday_view)
    ]
  • 视图函数 
    from django.http import HttpResponse
    
    
    def birthday_view(request, year, month, day):
        print(request.path_info)
        html = "<h1>%s年%s月%s日</h1>" % (year, month, day)
        return HttpResponse(html)

Django是一个流行的高级Python Web框架,它提供了很多内置的功能,包括一个强大的ORM(对象关系映射)系统和用于快速搭建应用的能力。如果要在Django中创建一个通知(Notification)应用程序,通常会涉及以下几个步骤: 1. **模型设计**:首先,你需要定义一个`Notification`模型,包含基本的信息如标题、内容、发送者和接收者等。可能还会有一个状态字段(如已读/未读)。 ```python from django.db import models class Notification(models.Model): title = models.CharField(max_length=200) content = models.TextField() sender = models.ForeignKey(User, on_delete=models.CASCADE, related_name='sent_notifications') recipient = models.ForeignKey(User, on_delete=models.CASCADE, related_name='received_notifications') is_read = models.BooleanField(default=False) ``` 2. **视图处理**:对于用户接收和管理通知,你可以创建视图函数来显示通知列表、标记为已读、删除通知等。例如,展示通知可能涉及到从数据库获取用户的通知并分页展示。 3. **模板渲染**:创建HTML模板,比如`notifications.html`,用于显示通知详情或通知列表。 4. **信号和任务**:如果需要异步处理(比如通过邮件、推送通知等),可以使用Django的信号系统结合Celery或其他任务队列工具。 5. **URL配置**:在urls.py文件中设置路由,将用户访问通知的URL映射到相应的视图函数。 6. **权限管理**:为了保护用户的隐私,可能需要对哪些用户可以看到特定通知进行权限控制。 完成以上步骤后,用户就可以在Django网站上看到和管理他们的通知了。如果你有更具体的问题,比如如何实现某种功能或者遇到技术难题,欢迎提问:
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值