Django——路由

Django——路由

1、路由分发

可以在每个应用中创建一个 urls.py 进行在该应用中的路由匹配。

# include 在根目录路由中对应用的路由进行分发
# 对 UrlApp 应用分发一个 路由配置
path('urlapp/' , include('UrlApp.urls')),
path('urlapp2/' , include('UrlApp2.urls'))

2、匹配路由

1、使用正则表达式

re_path 方法是使用正则定义 url

在需要对应用户的数据进行验证的时候,会使用正则表达式匹配路由

# 使用正则表达式匹配路由的时候必须匹配开头以及结尾(^正则表达式/$)
re_path(r'^[A-Z0-9]+/$'  , views.re_views),

2、URL参数传递

在 path 解析 url 中携带的参数,使用 来获取路由中对应位置的数据。url接收到这个参数之后,会传递给对应关系的视图。

# 获取 url 中的参数
path('demo/<urldata>/' , views.get_url_data),
def get_url_data(request , urldata):
    return HttpResponse(f'从 url 中获取到的参数为: {urldata}')

url 映射中的 path 和 re_path 方法可以传入第三个参数,这个参数会作为请求的附加数据,在项目中这个附加数据会一起传递给对应的视图函数。

这个附加数据必须以字典的形式写入

# 在 url 映射方法中携带附加数据
path('extra/' , views.extra , {'age':27}),

path('default/' , views.default_data),
path('default/<data>/' , views.default_data),
def extra(request , age):
    return HttpResponse(f'获取 url 映射方法中的附加数据:{age}')

def default_data(request , data=369):
    # 当匹配的 url 有获取到同名的参数的情况,该默认数据会被覆盖。
    return HttpResponse(f'从 url 中获取到的参数为: {data}')

3、路由转换器

转换器的本质上也是使用正则进行匹配

# 转换器写法:<转换器名称:参数名>
# int: 匹配0以及正整数。获取到的数据会被解析为int类型
path('int/<int:data>/' , views.int_view),
# str : 匹配除了 URl 分隔符(/) 之外的非空字符串
path('str/<str:data>/' , views.str_view),
# path : 匹配任意非空字符
path('path/<path:data>/' , views.path_view),
# slug: 匹配字母, 数字 , 下划线 ,横杆组成的字符串
path('slug/<slug:data>/' , views.slug_view),
def int_view(request , data):
    print(type(data))
    return HttpResponse(f'使用 int 转换器 , 接收到的数据为:{data}')

def str_view(request , data):
    return HttpResponse(f'使用 str 转换器 , 接收到的数据为:{data}')

def path_view(request , data):
    return HttpResponse(f'使用 path 转换器 , 接收到的数据为:{data}')

def slug_view(request , data):
    return HttpResponse(f'使用 slug 转换器 , 接收到的数据为:{data}')

3、反向解析路由

在 html 模板中用反向解析获取访问视图完整 URl 路径 , 需要给 url定义一个名称(给 url 起别名)

在 html 模板中反向解析路由的格式 : {% url 'URL的模式名称' 参数%}

<body>
<a href="/urlapp2/index/">点击开奖</a><br>
<a href="{% url 'num' %}">点击开奖,无奖竞猜</a>
<a href="{% url 'name_data' '尔康'%}">不要点击</a>
</body>
path('html/' , views.html_view),
path('index/' , views.index),
path('num/' , views.number_view , name='num'),
path('name/<data>/' , views.data_view , name='name_data'),
def index(request):
    return HttpResponse('我不好')

def html_view(request):
    return render(request , 'UrlDemo.html')

def number_view(request):
    number = randint(136 , 569)
    return HttpResponse(f'中奖号码为:{number}')

def data_view(request , data):
    return HttpResponse(f'{data} 是这个直播间最帅的!')

在后端视图中解析路由 , reverse(url模式名称)

def text(request):
    # 导入 reverse 解析路由方法
    return HttpResponse(f'视图解析路由为:{reverse("num")}')

def redirect_reverse(request):
    # return redirect(reverse('num'))
    # url 中的 name 解析名称可以直接在 redirect 中直接使用
    return redirect('num')

def text_data(request , data):
    # reverse(url名称 , args=[参数]/kwargs={参数})
    # return HttpResponse(f'视图解析路由为:{reverse("name_data" , args=["叶晓春"])}')
    return HttpResponse(f'视图解析路由为:{reverse("name_data" , args=[data])}')
path('text/' , views.text),
path('demo/' , views.redirect_reverse),
path('text_data/' , views.text_data),
path('text_data/<data>/' , views.text_data),

4、url的应用名称空间

在 应用的 urls.py 文件中 , 定义一个 app_name 的属性

# 定义当前应用的 url 应用名称空间
app_name = 'app2'
<!--
    当后端给 url 定义了应用名称空间之后
    在 html 中进行反向解析的时候,必须指定到那一个应用名称空间下查找
    {# {% url 'url应用名称空间:url名称' 参数%} #}
-->
<a href="{% url 'app2:num' %}">点击开奖,无奖竞猜</a>
<a href="{% url 'app2:name_data' '尔康'%}">不要点击</a>
def text(request):
    # 导入 reverse 解析路由方法
    return HttpResponse(f'视图解析路由为:{reverse("app2:num")}')

def redirect_reverse(request):
    # return redirect(reverse('num'))
    # url 中的 name 解析名称可以直接在 redirect 中直接使用
    return redirect('app2:num')

def text_data(request , data):
    # reverse(url名称 , args=[参数]/kwargs={参数})
    # return HttpResponse(f'视图解析路由为:{reverse("name_data" , args=["叶晓春"])}')
    return HttpResponse(f'视图解析路由为:{reverse("app2:name_data" , args=[data])}')
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
发出的红包

打赏作者

攒了一袋星辰

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值