Django(6)路由(二)

本文涉及的产品
云解析 DNS,旗舰版 1个月
全局流量管理 GTM,标准版 1个月
公共DNS(含HTTPDNS解析),每月1000万次HTTP解析
简介: Django(6)路由(二)

(2)正则路径——无名分组


  • 使用正则路径,需要使用re_path方法,同样通过name='别名'配置路径别名,实例:
- 修改urls.py文件
#-*- coding: utf-8 -*-
from django.urls import path,re_path
from . import views
urlpatterns = [
    path('index/',views.index),
    re_path('^login/([0-9]{4})/$',views.login,name="login"), 
]
- 修改views.py
# -*- coding: utf-8 -*-
from django.urls import reverse
from django.http import HttpResponse
from django.shortcuts import redirect,render
from django.views.decorators.csrf import csrf_exempt
@csrf_exempt
def index(request):
    if request.method == "GET":
        return HttpResponse("请使用POST")
    else:
        username = request.POST.get('username')
        pwd = request.POST.get('pwd')
        if username == 'zhangsan' and pwd == '123456':
            return HttpResponse("登录成功!!")
        else:
            return redirect(reverse('login',args=('2022',)))
@csrf_exempt
def login(request,year):  #添加一个参数
        print(year)
        return HttpResponse('Test')
  • 使用postman访问127.0.0.1:8000/index,观察终端


e2ab2c82ccc044328907b6c43216c822.png


d8ff125da84e4e4a9463571123a086df.png

(3)正则路径——无名分组


  • 实例:
- 修改urls.py文件
#-*- coding: utf-8 -*-
from django.urls import path,re_path
from . import views
urlpatterns = [
    path('index/',views.index),
    re_path('^login/(?P<year>[0-9]{4})/(?P<month>[0-9]{2})/$',views.login,name="login"), 
]
- 修改views.py文件
# -*- coding: utf-8 -*-
from django.urls import reverse
from django.http import HttpResponse
from django.shortcuts import redirect,render
from django.views.decorators.csrf import csrf_exempt
@csrf_exempt
def index(request):
    if request.method == "GET":
        return HttpResponse("请使用POST")
    else:
        username = request.POST.get('username')
        pwd = request.POST.get('pwd')
        if username == 'zhangsan' and pwd == '123456':
            return HttpResponse("登录成功!!")
        else:
            return redirect(reverse('login',kwargs={"year":"2022","month":"09"}))
@csrf_exempt
def login(request,year,month):
        print(year + month)
        return HttpResponse('Test')


使用postman访问127.0.0.1:8000/index,观察终端


9b8f8eb8e0a7480c80fa5661655e883b.png

cc0633bfc6664acebe4bb8ab1be0bd8b.png

四、反向解析(使用模板)


(1)普通路径


  • 在模板文件(html文件)中使用反向解析,利用{% url '别名' %}
  • urls.py文件
#-*- coding: utf-8 -*-
from django.urls import path
from . import views
urlpatterns = [
    path('index/',views.index),
    path('login/',views.login,name="login"),  #别名login
]
  • views.py文件
# -*- coding: utf-8 -*-
from django.urls import reverse
from django.http import HttpResponse
from django.shortcuts import redirect,render
from django.views.decorators.csrf import csrf_exempt
def index(request):  #index资源返回html页面,页面使用post方法反向解析到login资源
        return render(request,"test.html")
@csrf_exempt       #因为html使用post方法,所以需要使用装饰器将此函数可以接受post方式
def login(request):
        username = request.POST.get('username')
        pwd = request.POST.get('pwd')
        if username == "zhangsan" and pwd == "123456":
                return HttpResponse("登录成功")
        else:
                return HttpResponse("登录失败")
  • templates/test.html文件
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
    <h3>用户登录</h3>
    <form action="{% url 'login' %}" method="post">
        {% csrf_token %}   #使用post方式,需要添加
        <p>用户名:<input type="text" name="username"></p>
        <p>密码:<input type="text" name="pwd"></p>
        <input type="submit">
    </form>
</body>
</html>
  • 使用浏览器访问127.0.0.1:8000/index/,先输出正确的usernamepwd,查看终端输出,然后输出错误的参数

0384e8efe54a455d914d537d2e64e849.png

0df6f112a25a4e96a329ec6f8f9f151e.png4bba17b809644cb9ae2c6ad733270a02.pngfc22a80aa7034508880f7e7c9ee0467c.png

275a10c5f6bc4dfb84e0b29dc93bdf7d.png

(2)正则路径——无名分组


  • 使用正则路径时,模板中利用{% url "别名" 符合正则匹配的参数 %}来实现反向解析
  • urls.py文件
#-*- coding: utf-8 -*-
from django.urls import path,re_path
from . import views
urlpatterns = [
    path('index/',views.index),
    re_path('^login/([0-9]{4})/$',views.login,name="login"),  #别名login
]
  • views.py文件
# -*- coding: utf-8 -*-
from django.urls import reverse
from django.http import HttpResponse
from django.shortcuts import redirect,render
from django.views.decorators.csrf import csrf_exempt
def index(request):
        return render(request,"test.html")
@csrf_exempt     
def login(request,year):   #增加参数year
        username = request.POST.get('username')
        pwd = request.POST.get('pwd')
        if username == "zhangsan" and pwd == "123456":
                return HttpResponse("登录成功,当前年份:" + year)
        else:
                return HttpResponse("登录失败,当前年份:" + year)
  • templates/test.html文件
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
    <h3>用户登录</h3>
    <form action="{% url 'login' '2022' %}" method="post">    #无名分组,添加参数
        {% csrf_token %}
        <p>用户名:<input type="text" name="username"></p>
        <p>密码:<input type="text" name="pwd"></p>
        <input type="submit">
    </form>
</body>
</html>
  • 访问127.0.0.1:8000/index/,使用正确的usernamepwd,查看终端输出,然后使用错误的参数进行访问

f0ba49deac764b7381e5bbd00d1be2bc.png

42c118b3cff145dd9007c3c47648d961.png


62b62737215e4d278c0aa10a9078d5a3.png

35764d35b68b4613b906089d1f12b64e.png

e5321f4040b642a4a2b4fa7d728c8125.png

目录
相关文章
|
Python
django路由传参可默认为空
django路由传参可默认为空
90 0
|
4天前
|
Python
Django 框架的路由系统
Django 框架的路由系统
19 6
|
3月前
|
Python SEO
Django入门到放弃之路由
Django入门到放弃之路由
|
3月前
|
Python
[django]路由变量与正则表达式
[django]路由变量与正则表达式
|
5月前
|
JSON API 网络架构
Django REST framework视图集与路由详解:深入理解ViewSet、ModelViewSet与路由映射器
Django REST framework视图集与路由详解:深入理解ViewSet、ModelViewSet与路由映射器
|
5月前
|
存储 安全 网络协议
Django路由与会话深度探索:静态、动态路由分发,以及Cookie与Session的奥秘
Django路由与会话深度探索:静态、动态路由分发,以及Cookie与Session的奥秘
|
5月前
|
API 网络架构 Python
在django使用视图集和路由集
【6月更文挑战第11天】本文介绍Viewsets是Django REST框架中将多个视图逻辑整合到单个类的工具,减少了重复代码。当项目API变得复杂且有重复模式时,考虑使用它们;否则,保持视图和URL模式的简洁性。
41 3
|
5月前
|
API 数据库 网络架构
在django中应用视图和路由集
【6月更文挑战第10天】 本文介绍viewsets`和`Routers`是Django REST framework中用于简化API视图和路由的工具。它们提供了一个抽象层,允许用更少的代码替代多个相关视图,并能自动生成URL。定义`UserList`和`UserDetail`视图集,分别用于列表和详情展示。
26 3
|
5月前
|
缓存 JSON API
在django项目中使用装饰器管理路由
【6月更文挑战第12天】本文介绍了Python装饰器在API管理中的应用,包括用于延迟计算、缓存和转换函数的装饰器。实践中,以Django Rest Framework为例,演示了如何使用装饰器定义GET、POST、PUT和DELETE请求的视
57 1
|
11月前
|
前端开发 网络架构 Python
django实现动态路由的简单方法
django实现动态路由的简单方法
131 1