• Django之URL反向解析


    1、反向解析的概述和来由

    Django中提供了关于URL的映射的解决方案,可以做两个方向的使用

    • 1.普通解析过程:由客户端的浏览器发起一个url请求,Django根据url解析,把url中的参数捕获,调用相应的视图,获取相应的数据,然后返回给客户端显示。

    • 2.反向解析:通过一个视图的名字,再加上一些参数和值,逆向获取相应的url。简单来说,反向解析(本质)就是指通过一些方法,得到一个结果,该结果可以访问到对应的url并触发视图函数的运行

    反向解析的应用场景,是因为在软件开发初期,url地址的路径设计可能并不完美,后期需要进行调整,如果项目中很多地方使用了该路径,一旦该路径发生变化,就意味着所有使用该路径的地方都需要进行修改,这是一个非常繁琐的操作。

    因此,解决方案就是在编写一条url(regex,view,kwargs=None,name=None)时,可以通过参数nameurl地址的路径部分起一个别名,项目中就可以通过别名来获取这个路径。以后无论路径如何变化别名与路径始终保持一致。这种通过别名获取路径的过程就称为反向解析。

    2、反向解析的示例

    示例:登录成功跳转到index.html页面

    • urls.py
    from django.conf.urls import url
    from django.contrib import admin
    from app01 import views
    urlpatterns = [
        url(r'^admin/', admin.site.urls),
        
        url(r'^login/$', views.login,name='login_page'), # 路径login/的别名为login_page
        url(r'^index/$', views.index,name='index_page'), # 路径index/的别名为index_page
    ]
    
    • views.py
    from django.shortcuts import render 
    from django.shortcuts import reverse # 用于反向解析
    from django.shortcuts import redirect #用于重定向页面
    from django.shortcuts import HttpResponse
    
    def login(request):
        if request.method == 'GET':
            # 当为get请求时,返回login.html页面,页面中的{% url 'login_page' %}会被反向解析成路径:/login/
            return render(request, 'login.html')
    	
        # 当为post请求时,可以从request.POST中取出请求体的数据
        name = request.POST.get('name')
        pwd = request.POST.get('pwd')
        if name == 'kevin' and pwd == '123':
            url = reverse('index_page')  # reverse会将别名'index_page'反向解析成路径:/index/       
            return redirect(url) # 重定向到/index/
        else:
            return HttpResponse('用户名或密码错误')
    
    
    def index(request):
        return render(request, 'index.html')
    
    • login.html
    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <title>登录页面</title>
    </head>
    <body>
    <!--强调:login_page必须加引号-->
    <form action="{% url 'login_page' %}" method="post">
        <p>用户名:<input type="text" name="name"></p>
        <p>密码:<input type="password" name="pwd"></p>
        <p><input type="submit" value="提交"></p>
    </form>
    </body>
    </html>
    
    • index.html
    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <title>首页</title>
    </head>
    <body>
    <h3>我是index页面...</h3>
    </body>
    </html>
    

    测试:
    运行项目,在浏览器中输入http://127.0.0.1:8000/login/
    会看到登录页面,输入正确的用户名密码后会跳转到index.html页面,当修改路由表中匹配路径的正则表达式时,程序其余部分均无需修改

    因此,反向解析的一般用法是

    # 后端views.py反向解析的使用
      	from django.shortcuts import render,HttpResponse,redirect,reverse
      	url = reverse('login_page')
    # 前端模版login.html文件中,反向解析的使用
     	{% url 'login_page' %}
    

    3、url分组的反向解析

    如果路径中存在分组(无名分组和有名分组)的反向解析,例如

    from django.conf.urls import url
    from django.contrib import admin
    from app01 import views
    urlpatterns = [
        url(r'^admin/', admin.site.urls),
        
        url(r'^aritcle/(d+)/$',views.article,name='article_page'), # 无名分组
        url(r'^user/(?P<uid>d+)/$',views.article,name='user_page'), # 有名分组
    ]
    

    对应反向解析的写法是

    # 1 针对无名分组,比如要反向解析出:/aritcle/1/ 这种路径,写法如下
    在views.py中,反向解析的使用:
    	url = reverse('article_page',args=(1,)) 
    在模版login.html文件中,反向解析的使用
    	{% url 'article_page' 1 %}
    
        
    # 2 针对有名分组,比如要反向解析出:/user/1/ 这种路径,写法如下
    在views.py中,反向解析的使用:
    	url = reverse('user_page',kwargs={'uid':1}) 
    在模版login.html文件中,反向解析的使用
    	{% url 'user_page' uid=1 %}
    

    参考:小猿取经

  • 相关阅读:
    文件传输-一个大文件传输
    日志模块-logging模块
    加密模块hashlib
    面向对象进阶-反射
    面向对象
    模块和包
    作业-学生管理系统
    Java 链表反转
    Haoop MapReduce 的Partition和reduce端的二次排序
    Hadoop 笔记1 (原理和HDFS分布式搭建)
  • 原文地址:https://www.cnblogs.com/ssgeek/p/13200526.html
Copyright © 2020-2023  润新知